类型错误:__init_subclass__() 没有关键字参数

Rob*_*per 3 python metaclass

我正在尝试创建一个元类,但是当我将它分配给另一个类时,我收到了错误,TypeError: __init_subclass__() takes no keyword arguments但我没有实现任何__init_subclass__. 为什么要调用这个函数?


class Meta(type):
    def __new__(cls, name, bases, dct):
        return super().__new__(cls, name, bases, dct)

class MyClass(meta=Meta):
    pass
Run Code Online (Sandbox Code Playgroud)

Rob*_*per 7

更改metametaclass。传递给类签名的任何关键字参数都会传递给其父类的__init_subclass__方法。由于您输入meta而不是metaclassmetakwarg 被传递给其父级的 ( object)__init_subclass__方法:

>>> object.__init_subclass__(meta=5)
TypeError: __init_subclass__() takes no keyword arguments
Run Code Online (Sandbox Code Playgroud)

如果您实际实现了一个__init_subclass__但输入错误,则会引发类似的错误:

class Parent:
  def __init_subclass__(cls, handler=None):
    super().__init_subclass__()
    cls.handler = handler

class CorrectChild(Parent, handler=5):
  pass

class TypoChild(Parent, handle=5):
  # TypeError: __init_subclass__() got an unexpected keyword argument 'handle'
  pass
Run Code Online (Sandbox Code Playgroud)

  • 好的答案 - 只需一个更正:调用的默认“__init_subclass__”是“object.__init_subclass__”,而不是“type.__init_subclass__”:此方法在超类中而不是在元类中调用。另外,在方法内调用“super().__init_subclas__”也是一个很好的做法,这样您的基类就可以组合。 (2认同)