这是我的代码有效。
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)但我仍然得到同样的错误。
答案 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
。
值得注意的是,正如所写的那样,只有当headers
和headerArr
是代码中其他地方的全局变量时,此代码才有效。
此外,这意味着您只能在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
作为一个子模块,而不是作为一个类。