假设我用这样的元类定义了一个类 ngOnInit(){
this.panelState.panelOpenState1$.subscribe(panelOpenState1 => this.panelOpenState1 = panelOpenState1);
this.panelState.panelOpenState2$.subscribe(panelOpenState2 => this.panelOpenState2 = panelOpenState2);
}
ngAfterViewInit() {
// this.panelState.panelOpenState1$.subscribe(panelOpenState1 => this.panelOpenState1 = panelOpenState1);
// this.panelState.panelOpenState2$.subscribe(panelOpenState2 => this.panelOpenState2 = panelOpenState2);
}
:
A
然后,当我尝试访问类class Meta(type):
pass
class A(metaclass=Meta):
pass
的名称时,我得到了元类的名称:
A
但是,它不应该给我A.__class__.__name__
# 'Meta'
我定义的班级吗?
注意:我尝试使用A
,它确实给了我A.__mro__[0].__name__
,但是我仍然感到困惑,为什么A
给我元类名称。有人对此有解释吗?
答案 0 :(得分:3)
__class__
邓迪报告:
类实例所属的类。
class A
属于其元类的类-仅A
的实例属于类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
要获取类本身的名称,只需使用
A.__name__
如果您真的需要它。
我仍然是将answer变成What are metaclasses in Python?的一种方式-也许可以帮到您。
答案 1 :(得分:0)
A
已经是类-其名称在A.__name__
下。
如果尝试使用A.__class__.__name__
,您将获得A
是实例(即其元类)的类,名称。
A.__mro__[0].__name__
将遵循类A的“方法解析顺序”-__mro__
对象是一个具有所有类层次结构的元组,所有层次结构均始于定义的类本身,并以{{1}结尾}。因此,object
本身将始终是A.__mro__[0]
-并且A
与A.__mro__[0].__name__
相同。
A.__name__
和__name__
属性是可写属性:例如,在创建类后更改{__qualname__
会更改该类实例的默认__qualname__
。尽管它们位于语言定义中,并且“实时”位于类的插槽中(而不是在字典中),但可能创建__repr__
属性(我的意思是,内置属性元类上的__name__
对象或任何其他描述符,该对象将动态更改类的property
属性(但不能更改__name__
-这必须是该类的属性,并且必须是字符串)