这是我的代码。你知道吗
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()的内容。它与第一个代码段一起工作。但不是第二个,我试过做def doSomething(self):然后在另一个文件中我做newArr=s.doSomething(self),但仍然得到相同的错误。你知道吗
在Python中,如果显式声明
self
参数,则方法只能获得该参数。你已经为cleanStr
做过了;你只需要为doSomething
做同样的事情:现在,
self
被定义为一个参数,因此您可以使用它来调用self.cleanStr
,而无需获得NameError
。你知道吗值得注意的是,在编写时,只有当
headers
和headerArr
是代码中其他地方的全局变量时,此代码才能工作。你知道吗另外,这意味着您只能在
Spam
实例上调用doSomething
:你可以看到这个工作on repl.it。你知道吗
这是一个非常奇怪的界面。在
Spam
上有两个方法实际上不处理self
,而是从某个全局序列读取并附加到某个全局列表上。我无法想象这在哪里有用。但是如果你想做的话,你可以;你只需要把细节弄清楚。你知道吗如果你想知道实际使用一个类是什么样子的,因此值得拥有一个类和方法,而不是一堆单独的函数,可以这样做:
你的“有效版本”实际上不起作用,除非是意外:
不能对
S
的实例调用此函数,否则会得到TypeError: doSomething() missing 1 required positional argument: 'headers'
。您可以将它称为S.doSomething()
,但这只是因为python3碰巧对未绑定的方法使用普通函数对象,这意味着,只要您从不创建实例,就可以将它们用作静态方法。但这样做是不合理的。如果您真的想要一个静态方法,请用@staticmethod
声明一个。但通常情况下,你不需要;你只需要一个函数,在模块范围内。实际上,您在这里滥用S
作为子模块,而不是作为类。你知道吗相关问题 更多 >
编程相关推荐