Python ClassMethod 错误:恰好需要 1 个参数(给定 2 个)[重复]

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

提问人:nurabha 提问时间:5/6/2022 更新时间:5/6/2022 访问量:382

问:

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

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}

现在我尝试创建一个基类,并将此方法 ClassAttribsToDict 作为类方法包含:

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

但是,当我尝试在类 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 LanguagesEnum(EnumBase):
  EN = 0
  CN = 1
  FR = 2
  DE = 3

并期望将类属性转换为字典

>>> LanguagesEnum.ClassAttribsToDict(LanguagesEnum)
Python 方法 static

评论


答:

2赞 bmjeon5957 5/6/2022 #1

实际上,通过添加,您使 的第一个参数始终是它所包含的类(在这种情况下)。这类似于类中的“常规”方法总是以 开头,只是它采用类本身而不是类实例。@classmethoddef ClassAttribsToDictEnumBaseself

因此,当您调用 EnumBase.ClassAttribsToDict(AnimalEnums) 时,从方法的角度来看,它实际上类似于 ClassAttribsToDict(EnumBase, AnimalEnums)(因此它认为它有 2 个参数)。

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

(另外一个旁注 - 根据 PEP8,您可能应该切换到 class_attribs_to_dict 方法,类可以保持 CapsWords 风格)