Python 3 文档清楚地描述了如何确定类的元类:
- 如果没有给出base和没有明确的元类,则使用type()
- 如果给出了显式元类并且它不是type()的实例,那么它将直接用作元类
- 如果给出了类型()的实例作为显式元类,或者定义了基数,则使用派生最多的元类
因此,根据第二个规则,可以使用可调用来指定元类.例如,
class MyMetaclass(type):
pass
def metaclass_callable(name, bases, namespace):
print("Called with", name)
return MyMetaclass(name, bases, namespace)
class MyClass(metaclass=metaclass_callable):
pass
class MyDerived(MyClass):
pass
print(type(MyClass), type(MyDerived))
Run Code Online (Sandbox Code Playgroud)
是元类MyClass:metaclass_callable或MyMetaclass?文档中的第二条规则说,提供的可调用"直接用作元类".但是,MyMetaclass从那时起,元类似乎更有意义
MyClass并MyDerived有类型MyMetaclass,metaclass_callable 被叫一次然后看起来是不可恢复的,metaclass_callable以任何方式使用(据我所知)(他们使用MyMetaclass).你可以用一个你不能用一个实例做的调用type吗?接受任意可调用的目的是什么?