函数中python“self”参数的一个问题

2024-10-01 11:29:19 发布

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

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

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控制台上运行的 (顺便说一句,我使用的是pyscripter2.3和python3.12)

^{pr2}$

我得到的是:

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”参数在调用def函数时不需要填充。在

请把这个可怜的新手从这个麻烦的“现象”中解救出来,给他一些解决办法。 谢谢:)


Tags: 代码intestselfnewdeflinemsg
3条回答

您已经将addmsg定义为实例方法。你可能是说self.addmsg("test!")而不是{}。在

这可能有很多问题。让我们从顶部开始。看起来您实际上只是使用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子类化的,但是直接调用它的方法。您可以这样做:

^{pr2}$

您调用ECollector.addMsg的方式看起来像是将其用作python静态方法,这意味着它不会传递“self”参数(如果您是编程语言的新手,并且不了解什么是静态方法,请告诉我)。但是,我的猜测是您希望将它用作实例方法而不是静态方法。在

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

self.addmsg("test!")

相关问题 更多 >