方法中的python调用方法

2024-10-01 09:19:33 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的代码。你知道吗

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),但仍然得到相同的错误。你知道吗


Tags: 代码inselfforreturndefreplaceclass
1条回答
网友
1楼 · 发布于 2024-10-01 09:19:33

在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是代码中其他地方的全局变量时,此代码才能工作。你知道吗

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

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(),但这只是因为python3碰巧对未绑定的方法使用普通函数对象,这意味着,只要您从不创建实例,就可以将它们用作静态方法。但这样做是不合理的。如果您真的想要一个静态方法,请用@staticmethod声明一个。但通常情况下,你不需要;你只需要一个函数,在模块范围内。实际上,您在这里滥用S作为子模块,而不是作为类。你知道吗

相关问题 更多 >