获取具有元类的类的名称

时间:2019-01-02 16:44:04

标签: python python-3.x metaclass

假设我用这样的元类定义了一个类 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给我元类名称。有人对此有解释吗?

2 个答案:

答案 0 :(得分:3)

__class__邓迪报告:

  

类实例所属的类。

引用instance.__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]-并且AA.__mro__[0].__name__相同。

A.__name____name__属性是可写属性:例如,在创建类后更改{__qualname__会更改该类实例的默认__qualname__。尽管它们位于语言定义中,并且“实时”位于类的插槽中(而不是在字典中),但可能创建__repr__属性(我的意思是,内置属性元类上的__name__对象或任何其他描述符,该对象将动态更改类的property属性(但不能更改__name__ -这必须是该类的属性,并且必须是字符串)