简体   繁体   English

确定python中的类是否为元类

[英]Determine if a class in python is a metaclass

Is there a way in python to determine if a class object is a metaclass? python中是否有一种方法可以确定类对象是否为元类?

I know that you could check using the equality operator. 我知道您可以使用相等运算符进行检查。 metaclass == type 元类==类型

But that wouldn't cover for user defined metaclasses. 但这不能涵盖用户定义的元类。

Test if the object is a subclass of type : 测试对象是否是type的子type

issubclass(MetaClass, type)

This returns True for all metaclasses, including type itself. 对于所有元类,包括type本身,这将返回True

Demo: 演示:

>>> class Meta(type): pass
...
>>> class Foo(object): pass
...
>>> issubclass(Meta, type)
True
>>> issubclass(Foo, type)
False

Most metaclasses are type subclasses ( issubclass(metaklass, type) ) but not all : 大多数元类都是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

ie, the answer is "any callable eg, a class with a __call__() method that accepts the same arguments as type() and returns a class object will do": 即,答案是“任何可调用的对象,例如,具有__call__()方法的类,该类接受与type()相同的参数并返回类对象将可以执行”:

>>> class C(metaclass=lambda *a: lambda *a: None): pass
... 
>>> C()
>>> type(C)
<class 'function'>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM