Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python的一个问题';自我';函数中的参数_Python_Function_Python 3.x_Arguments - Fatal编程技术网

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;;;