关于Python函数中'self'参数的问题
这是一个简单测试的代码:
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 = []
这意味着每次你调用 addmsg
或 clear
时,它们会自动接收到一个隐含的第一个参数,就是这个类本身。按照我转换的这种方式,每个子类都会有自己的 msgs
。如果你希望所有子类共享一个 msgs
属性,那么你可以把 cls
改成 ECollector
。
另外,你还需要稍微调整一下你的子类,因为你是从 ECollector
继承的,但又直接调用它的方法。你可以这样做:
class test(ECollector):
dcodes = []
def new(self):
self.addmsg("test!")
3
你把 addmsg
定义成了一个实例方法。你可能想写的是 self.addmsg("test!")
,而不是 ECollector.addmsg("test!")
。