方法

时间:2018-06-12 17:50:12

标签: python oop

这是我的代码有效。

class S:
    def doSomething():
        for j in headers:
             for z in j:
                 st = str(z).strip()
                 stringValue = st.replace('\n', "")
                 headerArr.append(stringValue)

         return headerArr

我想用这个代替上面的代码。

class S:
    def cleanStr(self, stringVal):
        st = stringVal.strip()
        stringValue = st.replace('\n', "")
        return stringValue

    def doSomething():
        for j in headers:
            for z in j:
                newString = self.cleanStr(z)
                headerArr.append(newString)

        return headerArr

但是当我尝试运行这个新代码时,我得到了名字' self'没有定义。我提前为任何有缩进的错误道歉。在另一个文件中,我有类似newArr = s.doSomething()的东西。它适用于第一个代码片段。但不是第二个。我尝试过做doSomething(自我):然后在另一个文件中我做newArr = s.doSomething(self)但我仍然得到同样的错误。

1 个答案:

答案 0 :(得分:3)

在Python中,如果您明确声明方法,方法只会获得self参数。你已经为cleanStr做了这个;你只需要对doSomething

做同样的事情
class Spam:
    def cleanStr(self, stringVal):
        st = stringVal.strip()
        stringValue = st.replace('\n', "")
        return stringValue

    def doSomething(self):
        for j in headers:
            for z in j:
                newString = self.cleanStr(z)
                headerArr.append(newString)

现在,self被定义为一个参数,因此您可以使用它来调用self.cleanStr而无需获取NameError

值得注意的是,正如所写的那样,只有当headersheaderArr是代码中其他地方的全局变量时,此代码才有效。

此外,这意味着您只能在doSomething个实例上调用Spam

headers = [('abc', 'def\n', '\ng\nh\ni\n'), ('abc', 'def')]
headerArr = []
spam = Spam()
spam.doSomething()
assert headerArr == ['abc', 'def', 'ghi', 'abc', 'def']

您可以看到此工作on repl.it

这是一个非常奇怪的界面。你在Spam上有两个方法实际上并没有对self做任何事情,而是从一些全局序列中读取并附加到某个全局列表上。我无法想象这会有用。但是如果你想要做到这一点,你可以;你只需要了解正确的细节。

如果你想知道实际使用类的样子,因此值得拥有一个类和方法而不是一堆单独的函数,可能是这样的:

class Spam:
    def __init__(self):
        self.headerArr = []

    def cleanStr(self, stringVal):
        st = stringVal.strip()
        stringValue = st.replace('\n', "")
        return stringValue

    def doSomething(self, headers):
        for j in headers:
            for z in j:
                newString = self.cleanStr(z)
                self.headerArr.append(newString)

spam = Spam()
spam.doSomething([('abc', 'def\n', '\ng\nh\ni\n'), ('abc', 'def')])
spam.doSomething([('abc\n', 'def\n')])
assert spam.headerArr == ['abc', 'def', 'ghi', 'abc', 'def', 'abc', 'def']

除了意外之外,你的“有效版本”并没有真正起作用:

class S:
    def doSomething():
        for j in headers:
             for z in j:
                 st = str(z).strip()
                 stringValue = st.replace('\n', "")
                 headerArr.append(stringValue)

您无法在S的实例上调用此内容,或者您​​将获得TypeError: doSomething() missing 1 required positional argument: 'headers'。您可以将其称为S.doSomething(),但仅仅是因为Python 3碰巧使用普通函数对象进行未绑定的方法,这意味着,只要您从未创建实例,就可以将它们用作静态方法。但这不是一件合理的事情。如果您确实需要静态方法,请使用@staticmethod声明一个。但通常,你没有;你只需要一个函数,在模块范围内。你在这里有效地滥用S作为一个子模块,而不是作为一个类。