python 的print和特殊方法 __str__和__repr__


先提出一個疑問,為什么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__屬性,卻可以調用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM