Ошибка класса Python ClassMethod: принимает ровно 1 аргумент (даны 2)

Я сделал функцию КлассАтрибстодикт, которая будет преобразовывать определенные пользователем атрибуты в классе в словарь.

def ClassAttribsToDict(myclass):
  return dict(filter(lambda (k,v): not k.startswith("__"),vars(myclass).items()))

class AnimalEnums(object):
  dog = 0
  cat = 2
  horse = 7

Выполнение функции для имени класса преобразует его в словарь

>>> ClassAttribsToDict(AnimalEnums)
{'horse': 7, 'dog': 0, 'cat': 2}

Теперь я попытался создать базовый класс и включить этот метод КлассАтрибстодикт как метод класса:

class EnumBase(object):
  @classmethod
  def ClassAttribsToDict(myclass):
    return dict(filter(lambda (k,v): not k.startswith("__"),vars(myclass).items()))

Однако, когда я пытаюсь вызвать функцию ClassAttribsToDict для класса EnumBase, я получаю следующую ошибку:

>>> EnumBase.ClassAttribsToDict(AnimalEnums)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ClassAttribsToDict() takes exactly 1 argument (2 given)

Кроме того, я хочу унаследовать класс EnumBase, чтобы они вели себя как перечисление следующим образом:

class LanguagesEnum(EnumBase):
  EN = 0
  CN = 1
  FR = 2
  DE = 3

И ожидайте преобразования атрибутов класса в словарь

>>> LanguagesEnum.ClassAttribsToDict(LanguagesEnum)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, добавляя @classmethod, вы делаете первым параметром def ClassAttribsToDict всегда класс, в который он включен (в данном случае это будет EnumBase). Это похоже на то, как ваши «обычные» методы в классе всегда начинаются с self, за исключением того, что он принимает сам класс вместо экземпляра класса.

Поэтому, когда вы вызываете EnumBase.ClassAttribsToDict(AnimalEnums), он фактически действует как ClassAttribsToDict(EnumBase, AnimalEnums) с точки зрения метода (таким образом, он думает, что у него есть 2 аргумента).

в любом случае: изменение на def ClassAttribsToDict(cls, myclass):, скорее всего, сработает для вас.

(Также примечание - согласно PEP8 вам, вероятно, следует переключиться на class_attribs_to_dict для методов, классы могут оставаться в стиле CapsWords)

Другие вопросы по теме