__class__属性与元类

 1 class M(type):
 2     def __str__(self):
 3         return "gege"
 4     aa = "ccf"
 5     cc = "ccc"
 6 
 7 class TM:
 8     cc = "ddd"
 9     __metaclass__ = M
10 print (TM.__class__)#<class '__main__.M'>
11 a = TM()
12 print (TM.__metaclass__.cc)#ccc
13 print (TM.aa)#ccf
14 print (TM.cc)#ddd
15 #print (a.aa) #error

class属性类似于以上例子中的__metaclass__

实例.__class__等价于实例的所属类

 

 

回过头来补充说明。

继承type类的类就是元类,而我们新创建一个类,__metaclass__可以指定这个类是哪个元类的对象,如果不指定,则默认是type类的对象

 

更新:

类与类的类,跟实例与类,这两个对应还是有点区别的。

就比如上面那个例子,类TM的类M具备aa属性,我们用dir(TM)是看不到aa属性的,用hasattr(TM,"aa"),返回的也是false,但这不妨碍TM可以调用aa属性,只不过,TM的实例不能调用aa属性。

而一般的实例与类,只要类中具备的属性,用dir(实例)查看都能看到

 

posted @ 2018-02-05 03:51  扫驴  阅读(282)  评论(0编辑  收藏  举报