TypeError:元类“不带参数”

时间:2019-10-27 14:27:24

标签: python python-3.x metaclass

为什么以下代码会出错:

class StateMeta:
    def __call__(*args, **kwargs):
        pass
    # end __call__
# end StateMeta

class State(metaclass=StateMeta):
    pass

错误:

Traceback (most recent call last):
  File "D:/FILE_MGMT_PYTHON/tempHSHDFHS).py", line 7, in <module>
    class State(metaclass=StateMeta):
TypeError: StateMeta() takes no arguments

2 个答案:

答案 0 :(得分:2)

您忘记让元类继承自type,而是写StateMeta(type)而不是StateMeta

答案 1 :(得分:0)

通过 __call__ 模拟可调用对象旨在处理定义类的实例,而不是定义类本身。因此,您必须使用类 StateMeta 的实例:

class StateMeta:
    def __call__(self, *args, **kwargs):
        print("Called StateMeta")
        pass
    
state_meta = StateMeta()
class State(metaclass=state_meta):
    pass

除此之外,有点令人惊讶的是,您可以使用函数作为元类:

def meta(*args, **kwargs):
    print("meta()", args, kwargs)
    return object

class A(metaclass=meta):
    pass