我們在定義Python類時,經常會看到比較好的代碼中,都有__repr__和__string__,兩個內部函數的定義。但是我一直很少關注它們的區別和具體應用場景。稍微做個小結。
1.__foo()__在python中表示__foo__是一個私有private 函數,在CookBook pp254中,解釋為,該函數不會被子類的相同名稱的函數重載。一般地說,類中以“下劃線”開頭定義的變量或者函數都是私有變量或者內部函數,區別是:
? 1.1 單下劃線開始的變量或者函數表示非公有名稱,會被子類初始化時處理,也就是說暴露給繼承的子類。
? 1.2 雙下劃線開頭的變量或函數會對子類隱藏
2.__repr__(),可以被用于obj=eval(repr(obj)),也就說是可以用該函數返回值的字符串文本重新創建該類的實例;而__str__(),是將實例轉換為一個字符串。
?
#coding:utf-8
class Test():
def __init__(self,x,y):
self.x=x
self.y=y
def __repr__(self):
return 'Test({0.x!r},{0.y!r})'.format(self)
def __str__(self): #convert the instance to string,then print out
return '({0.x!s},{0.y!s})'.format(self)
#output:
In [4]: from my_repr import Test
In [5]: test=Test
In [6]: test
Out[6]: my_repr.Test
In [7]: test=Test(3,4) #實例化對象
In [8]: test
Out[8]: Test(3,4) #返回的是__repr__()中的字符串
In [9]: print(test) #返回的是__str__()的值
(3,4)
In [10]: tt=eval(repr(test)) #tt是Test類的另一個實例
In [11]: tt
Out[11]: Test(3,4)
In [12]: id(tt)==id(test)
Out[12]: False
In [13]: id(tt)
Out[13]: 2302160271176
In [14]: id(test)
Out[14]: 2302160237176
In [15]: type(test)==type(tt)
Out[15]: True
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
