这是一个简单测试的代码:
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函数时不需要填充的。
请通过给他解决方案,从这个麻烦的“现象”中拯救这个可怜的新手。 谢谢:))
答案 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 = []
这意味着无论何时调用addmsg
或clear
,它们都会获得类本身的隐含的第一个参数。以这种特殊的方式,我已经转换它,每个子类将获得自己的msgs
。如果您希望所有子类共享一个msgs
属性,则可以将cls
更改为ECollector
此外,您将希望稍微改变您的子类,因为您是ECollector
的子类,但后来直接调用它的方法。你可以这样做:
class test(ECollector):
dcodes = []
def new(self):
self.addmsg("test!")
答案 2 :(得分:1)
您调用ECollector.addMsg
的方式看起来就像是将它用作python静态方法,这意味着它不会通过“自我”参数(让我知道如果你是一个一般来说是编程语言的新手,并且不了解静态方法是什么)。但是,我的猜测是你想将它用作实例方法而不是静态方法。
相反,您可能希望按以下方式执行此操作:
self.addmsg("test!")