关于Python函数中'self'参数的问题

0 投票
3 回答
2838 浏览
提问于 2025-04-16 07:05

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

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还是个新手……对这一切感到有点困惑;;; 我以为在调用一个定义的函数时,'self'这个参数是不需要填写的。

请帮帮这个可怜的新手,给他一些解决方案。 谢谢你 :)

3 个回答

1

你调用 ECollector.addMsg 的方式看起来像是在把它当作 Python 的静态方法来用,这样的话它就不会传递一个“self”参数(如果你对编程语言还不太了解,不知道什么是静态方法,可以告诉我)。不过,我猜你其实是想把它当作实例方法来用,而不是静态方法。

所以,你可能想这样做:

self.addmsg("test!")
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!")
3

你把 addmsg 定义成了一个实例方法。你可能想写的是 self.addmsg("test!"),而不是 ECollector.addmsg("test!")

撰写回答