获取具有元 class 的 class 的名称

Getting the name of a class which has a meta class

假设我定义一个 class A 和一个元 class 像这样:

class Meta(type):
    pass

class A(metaclass=Meta):
    pass

然后,当我尝试访问 class A 的名称时,我得到了元 class 的名称:

A.__class__.__name__
#  'Meta'

然而,它不应该给我A,我定义的class吗?

注意:我尝试使用A.__mro__[0].__name__,它确实给我A,但我仍然很困惑为什么A.__class__给我元 class 名称。有人对此有解释吗?

__class__ dunder 报告:

the class to which a class instance belongs.

引自instance.__class__

class A 属于其元 class 的 class - 只有 A 的实例属于 class A 本身.

a = A() 
print(a.__class__.__name__) # 'A' 
print(A.__class__.__name__) # 'Meta'

class P: pass 

print(P.__class__.__name__) # type 
print(P().__class__.__name__) # P

要获取 class 本身的名称,只需使用

A.__name__

如果你真的需要它。


我仍然有办法摸索所有 answer to What are metaclasses in Python? - 也许它能帮助你。

A 已经是 class - 它的名称在 A.__name__ 之下。 如果你尝试 A.__class__.__name__ 你会得到 class 其中 A 是实例(即它的 metaclass),name.

A.__mro__[0].__name__ 将在 "method resolution order" 之后用于 class A - __mro__ 对象是一个包含所有 class 层次结构的元组,从定义 class 本身并以 object 结束。因此,A.__mro__[0] 将始终是 A 本身 - A.__mro__[0].__name__A.__name__ 相同。

__name____qualname__ 属性是可写属性:在创建 class 之后更改 { __qualname__ 将更改实例的默认值 __repr__例如 class。尽管它们在语言定义中并且 "live" 在 class 中的插槽中(不在它的字典中),但 可能 创建一个 __name__ 属性(我的意思是,内置 property 对象,或任何其他描述符)在 metaclass 上,将动态更改 [=39= 的 __name__ 属性](但不是 __qualname__ - 这必须是 class 的属性,并且必须是字符串)