先提出一個疑問,為什么print函數可以直接打印參數呢?即使是數字?例如print 1,就會打印1。我們知道1的類型是整型(題外話,在python中1是常量,也是類int的對象,而java中1只是常量),按理說print接受的參數應該是字符串啊?
回答:
因為print函數會首先調用str()函數將參數轉化為str類型,而str()函數會調用這個參數所屬類中的__str__方法(如果類中有此方法的話),我們可以重寫這個__str__方法。
1 class poo(object): 2 def __str__(self): 3 return "haha" 4 p = poo() 5 print p#打印haha
來一個特殊的,類對象(普通對象的類是類,就像上面的p對象,他所屬類是poo,python一切接對象,poo這個類也是對象,那么他所屬哪個類呢?答案是元類type,當然我們也可以通過繼承type創建一個元類,然后指定poo所屬類為我們創建的這個元類):
1 class M(type): 2 def __str__(self): 3 return "gege" 4 5 class TM: 6 __metaclass__ = M#指定類對象TM所屬類為M 7 print (TM.__class__) 8 print TM#調用TM所屬類的__str__方法
如果這個參數所屬的類中,沒有__str__方法,會出現什么情況呢?這里只說現象,為什么會這樣留着以后進一步研究(個人初步猜想是py2為了讓經典類兼容新式類的舉措。在py2中沒有繼承object類的類叫做經典類,而py3中所有的類都繼承了object,也就不存在新舊類的區分了,而新式類由於繼承object,繼而有__str__方法,__base__,__class__等屬性。
py2為了和py3保持統一,即使我們定義經典類時不定義__class__屬性,py2也會運用某種機制,使得經典類的對象同樣可以像python3的對象那樣調用__class__屬性)
1 class b: 2 pass 3 bb = b() 4 print bb#<__main__.b instance at 0x02AFD530> 5 print dir(bb)#['__doc__', '__module__'] 6 print bb.__class__#__main__.b,類中沒有__class__屬性,卻可以調用
