获取具有元 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.
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 的属性,并且必须是字符串)
假设我定义一个 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.
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 的属性,并且必须是字符串)