确定 python 中的 class 是否是 metaclass
Determine if a class in python is a metaclass
python 中有没有一种方法可以确定 class 对象是否是元class?
我知道您可以使用相等运算符进行检查。
元class ==类型
但这不包括用户定义的元classes。
测试对象是否是type
的子类:
issubclass(MetaClass, type)
这 returns True
适用于所有元类,包括 type
本身。
演示:
>>> class Meta(type): pass
...
>>> class Foo(object): pass
...
>>> issubclass(Meta, type)
True
>>> issubclass(Foo, type)
False
大多数元类是 type
子类 (issubclass(metaklass, type)
) 但不是全部:
>>> def logging_meta(name, bases, namespace, **kwd):
... print(name, bases, namespace, kwds)
... return type(name, bases, namespace, **kwds)
...
>>> class C(metaclass=logging_meta):
... a = 1
...
C () {'__module__': '__main__', '__qualname__': 'C', 'a': 1} {}
>>> issubclass(logging_meta, type)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class
即答案是"any callable e.g., a class with a __call__()
method that accepts the same arguments as type()
and returns a class object will do":
>>> class C(metaclass=lambda *a: lambda *a: None): pass
...
>>> C()
>>> type(C)
<class 'function'>
python 中有没有一种方法可以确定 class 对象是否是元class?
我知道您可以使用相等运算符进行检查。 元class ==类型
但这不包括用户定义的元classes。
测试对象是否是type
的子类:
issubclass(MetaClass, type)
这 returns True
适用于所有元类,包括 type
本身。
演示:
>>> class Meta(type): pass
...
>>> class Foo(object): pass
...
>>> issubclass(Meta, type)
True
>>> issubclass(Foo, type)
False
大多数元类是 type
子类 (issubclass(metaklass, type)
) 但不是全部:
>>> def logging_meta(name, bases, namespace, **kwd):
... print(name, bases, namespace, kwds)
... return type(name, bases, namespace, **kwds)
...
>>> class C(metaclass=logging_meta):
... a = 1
...
C () {'__module__': '__main__', '__qualname__': 'C', 'a': 1} {}
>>> issubclass(logging_meta, type)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class
即答案是"any callable e.g., a class with a __call__()
method that accepts the same arguments as type()
and returns a class object will do":
>>> class C(metaclass=lambda *a: lambda *a: None): pass
...
>>> C()
>>> type(C)
<class 'function'>