函数中python'self'参数的问题

时间:2010-11-15 07:15:38

标签: python function python-3.x arguments

这是一个简单测试的代码:

class ECollector:
    #error msg collector
    #this class should be used as 'global'
    msgs = []
    def addmsg(self,msg):
        self.msgs.append(msg)
    def clear(self):
        self.msgs = []

class test(ECollector):
    dcodes = []
    ECollector
    def new(self):
        ECollector.addmsg("test!")

这就是我在python控制台上运行的内容 (顺便说一下,我正在使用pyscripter 2.3和Python 3.12)

>>>a = test()
>>>a.new()

以下是我得到的:

Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "C:\...\test.py", line 14, in new
    ECollector.addmsg("test!")
TypeError: addmsg() takes exactly 2 positional arguments (1 given)

我是python的新手...而且我对这整件事感到困惑;;; 我认为“自我”论证是你在调用def函数时不需要填充的。

请通过给他解决方案,从这个麻烦的“现象”中拯救这个可怜的新手。 谢谢:))

3 个答案:

答案 0 :(得分:3)

您已将addmsg定义为实例方法。您可能需要self.addmsg("test!")而不是ECollector.addmsg("test!")

答案 1 :(得分:2)

这可能有很多问题。让我们从顶部开始。看起来您实际上只是使用ECollector作为命名空间来对某些函数进行分组。没关系,但你想调用ECollector.some_method,你需要通过将这些方法变成类方法来改变一些事情:

class ECollector:
    """error msg collector
    this class should be used as 'global'"""

    msgs = []

    @classmethod
    def addmsg(cls,msg):
        cls.msgs.append(msg)

    @classmethod
    def clear(cls):
        cls.msgs = []

这意味着无论何时调用addmsgclear,它们都会获得类本身的隐含的第一个参数。以这种特殊的方式,我已经转换它,每个子类将获得自己的msgs。如果您希望所有子类共享一个msgs属性,则可以将cls更改为ECollector

此外,您将希望稍微改变您的子类,因为您是ECollector的子类,但后来直接调用它的方法。你可以这样做:

class test(ECollector):
    dcodes = []
    def new(self):
        self.addmsg("test!")

答案 2 :(得分:1)

您调用ECollector.addMsg的方式看起来就像是将它用作python静态方法,这意味着它不会通过“自我”参数(让我知道如果你是一个一般来说是编程语言的新手,并且不了解静态方法是什么)。但是,我的猜测是你想将它用作实例方法而不是静态方法。

相反,您可能希望按以下方式执行此操作:

self.addmsg("test!")