Я сделал функцию КлассАтрибстодикт, которая будет преобразовывать определенные пользователем атрибуты в классе в словарь.
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)
По сути, добавляя @classmethod
, вы делаете первым параметром def ClassAttribsToDict
всегда класс, в который он включен (в данном случае это будет EnumBase
). Это похоже на то, как ваши «обычные» методы в классе всегда начинаются с self
, за исключением того, что он принимает сам класс вместо экземпляра класса.
Поэтому, когда вы вызываете EnumBase.ClassAttribsToDict(AnimalEnums), он фактически действует как ClassAttribsToDict(EnumBase, AnimalEnums) с точки зрения метода (таким образом, он думает, что у него есть 2 аргумента).
в любом случае: изменение на def ClassAttribsToDict(cls, myclass):
, скорее всего, сработает для вас.
(Также примечание - согласно PEP8 вам, вероятно, следует переключиться на class_attribs_to_dict для методов, классы могут оставаться в стиле CapsWords)