【问题标题】:TypeError: __init_subclass__() takes no keyword argumentsTypeError: __init_subclass__() 没有关键字参数
【发布时间】:2020-12-06 11:04:31
【问题描述】:

我正在尝试创建一个元类,但是当我将它分配给另一个类时,我收到错误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

【问题讨论】:

    标签: python metaclass


    【解决方案1】:

    meta 更改为metaclass。传递给类签名的任何关键字参数都会传递给其父类的__init_subclass__ 方法。由于您输入了meta 而不是metaclass,因此此meta kwarg 将传递给其父级的(object) __init_subclass__ 方法:

    >>> object.__init_subclass__(meta=5)
    TypeError: __init_subclass__() takes no keyword arguments
    

    如果您实际实现了__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
    

    【讨论】:

    • 好答案 - 只是一个更正:调用的默认 __init_subclass__object.__init_subclass__,而不是 type.__init_subclass__:此方法在超类中调用,而不是在元类上。此外,在方法内部调用super().__init_subclas__ 是一个很好的做法,这样您的基类就可以组合了。
    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 2021-04-08
    • 2021-06-17
    • 1970-01-01
    • 2020-12-09
    • 2020-09-12
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多