Python ClassMethod Error: takes exactly 1 argument (2 given)

Python ClassMethod Error: takes exactly 1 argument (2 given)

我创建了一个函数 ClassAttribsToDict,它将 class 中的用户定义属性转换为字典。

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

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

对 class 名称执行函数会将其转换为字典

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

现在我尝试创建一个基础 class 并将此方法 ClassAttribsToDict 作为 class 方法 :

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

然而,当我尝试在 class EnumBase 上调用 ClassAttribsToDict 函数时,出现以下错误:

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

此外,我想继承 EnumBase class 使它们像枚举一样表现如下:

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

并希望将 class 属性转换为字典

>>> LanguagesEnum.ClassAttribsToDict(LanguagesEnum)

实际上,通过添加 @classmethod,您可以使 def ClassAttribsToDict 的第一个参数始终是它所包含的 class(在本示例中为 EnumBase案件)。它类似于 class 中的“常规”方法总是以 self 开头,只是它采用 class 本身而不是 class 实例。

所以当你调用 EnumBase.ClassAttribsToDict(AnimalEnums) 时,从方法的角度来看,它实际上表现得像 ClassAttribsToDict(EnumBase, AnimalEnums)(因此它认为它有 2 个参数)。

无论如何:更改为 def ClassAttribsToDict(cls, myclass): 很可能适合您。

(还有一个旁注 - 根据 PEP8,你应该切换到 class_attribs_to_dict 的方法,classes 可以保持 CapsWords 风格)