Проблема с аргументом Python 'self' в функциях - PullRequest
0 голосов
/ 15 ноября 2010

Это код для простого теста:

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' - это то, что вам не нужно заполнять при вызове функции def.

Пожалуйста, спасите этого бедного новичка от этого неприятного «явления», дав ему решения. Спасибо:)

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

Вы определили addmsg как метод экземпляра.Вы, вероятно, имели в виду self.addmsg("test!") вместо ECollector.addmsg("test!").

2 голосов
/ 15 ноября 2010

Есть много вещей, которые могут быть не правы с этим.давайте начнем с вершины.Похоже, вы действительно просто используете 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!")
1 голос
/ 15 ноября 2010

Способ, которым вы вызываете ECollector.addMsg, выглядит так, как будто вы используете его как статический метод python, что означает, что он не пройдет через параметр "self" (дайте мне знать, если вы новичок в языки программирования в целом и не понимаю, что такое статический метод). Однако я предполагаю, что вы хотите использовать его как метод экземпляра, а не как статический метод.

Вместо этого вы, вероятно, захотите сделать это следующим образом:

self.addmsg("test!")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...