python的一个问题';自我';函数中的参数
这是一个简单测试的代码:python的一个问题';自我';函数中的参数,python,function,python-3.x,arguments,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 =
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)
以下是我得到的:
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)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\…\test.py”,第14行,新格式
ecoCollector.addmsg(“测试!”)
TypeError:addmsg()正好接受2个位置参数(给定1个)
我是python的新手……我对这整件事相当困惑;;;
我认为调用def函数时不需要填充“self”参数
请通过给这个可怜的新手提供解决方案,把他从这个麻烦的“现象”中解救出来。
谢谢:)您已经将
addmsg
定义为实例方法。您可能是指self.addmsg(“test!”)
而不是ecoCollector.addmsg(“test!”)
您已经将addmsg
定义为实例方法。您可能是指self.addmsg(“test!”)
而不是ecoCollector.addmsg(“test!”)
调用ecoCollector.addmsg
的方式看起来像是将其用作python静态方法,这意味着它不会通过“self”参数(如果您是编程语言的新手,不了解什么是静态方法,请告诉我)。但是,我猜您希望将其用作实例方法,而不是静态方法
相反,您可能希望按如下方式执行:
self.addmsg("test!")
调用
ecoCollector.addMsg
的方式看起来像是将其用作python静态方法,这意味着它不会通过“self”参数(如果您是编程语言的新手,不了解静态方法是什么,请告诉我)。但是,我猜您希望将其用作实例方法,而不是静态方法
相反,您可能希望按如下方式执行:
self.addmsg("test!")
这可能有很多问题。让我们从顶部开始。看起来您实际上只是在使用
ecoCollector
作为命名空间来对一些函数进行分组。这没关系,但您希望调用ecoCollector。一些\u方法
您需要改变一些情况,将这些方法转换为类方法:
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代码>至电子采集器
此外,您还需要稍微更改一下您的子类,因为您是从ecoCollector
进行子类化的,但随后直接调用它的方法。您可以这样做:
class test(ECollector):
dcodes = []
def new(self):
self.addmsg("test!")
这可能有很多问题。让我们从顶部开始。看起来您实际上只是在使用ecoCollector
作为命名空间来对一些函数进行分组。这没关系,但您希望调用ecoCollector。一些\u方法
您需要改变一些情况,将这些方法转换为类方法:
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代码>至电子采集器
此外,您还需要稍微更改一下您的子类,因为您是从ecoCollector
进行子类化的,但随后直接调用它的方法。您可以这样做:
class test(ECollector):
dcodes = []
def new(self):
self.addmsg("test!")
把ecocollector
放在test
定义的第二行,你想实现什么?目前,它完全没有任何作用。把ecocollector
放在test
定义的第二行,你想实现什么?目前,它完全没有任何作用nk你:)我还以为这是一个python bug;;;谢谢:)我以为这是一个python bug;;;