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(实例)查看都能看到