前言Python中__repr__ 和__str__ 使用區(qū)別 __repr__ 使用
很多時(shí)候我們?cè)趧?chuàng)建一個(gè)類的時(shí)候,在終端打印類的實(shí)例,,看到的是一個(gè)類似于這樣的內(nèi)容:<XXX object at 0x0000000001222E10> class MyDefined(object):
def __init__(self): self.name = "yoyo" 在終端調(diào)試結(jié)果 >python Python 3.6.6 >>> from a import MyDefined >>> yo=MyDefined() >>> yo <a.MyDefined object at 0x0000015EEEB1F0B8> >>> 返回的是對(duì)象的內(nèi)存地址,,對(duì)于初學(xué)者看起來(lái)很不友善,,初學(xué)者無(wú)法理解返回的內(nèi)容,于是可以加一個(gè)__repr__ 方法 class MyDefined(object):
def __init__(self): self.name = "yoyo"
def __repr__(self): return '<object MyDefined: {}>'.format(self.name) 重新在終端調(diào)試 >python Python 3.6.6 >>> from a import MyDefined >>> yo=MyDefined() >>> yo <object MyDefined: yoyo> >>> print(yo) <object MyDefined: yoyo> 從打印的結(jié)果就可以看到返回的是<object MyDefined: yoyo> ,這樣用戶就知道返回的是什么實(shí)例對(duì)象,,便于開發(fā)者理解,。
__repr__ 是直接輸出對(duì)象(面向開發(fā)者),,方便提供接口給開發(fā)者使用,,如django里面的ORM查詢,返回queryset對(duì)象,。 __str__ 使用
__str__ 方法是在print()打印的時(shí)候輸出給用戶看的,,面向的是普通的用戶,方便用戶知道返回的是什么實(shí)例對(duì)象,。
class MyDefined(object):
def __init__(self): self.name = "yoyo"
def __str__(self): return '<object MyDefined: {}>'.format(self.name) 在終端調(diào)試 >python Python 3.6.6 >>> from a import MyDefined >>> yo=MyDefined() >>> yo <a.MyDefined object at 0x000001A4C133F128> >>> print(yo) <object MyDefined: yoyo> >>> 從結(jié)果可以看到直接輸入yo,,返回的還是object at 0x000 ,只有print()輸出的時(shí)候才會(huì)打印__str__ 返回的內(nèi)容 總結(jié)注意:__str__() 方法和__repr__() 方法的返回值只能是字符串!
__repr__ 和__str__ 這兩個(gè)方法都是用于顯示的,,__str__ 是面向用戶的,,而__repr__ 面向開發(fā)者 關(guān)于調(diào)用兩種方法的時(shí)機(jī) 使用print()時(shí) 使用%s和f’{}’拼接對(duì)象時(shí) 使用str(x)轉(zhuǎn)換對(duì)象x時(shí) 在上述三種場(chǎng)景中,會(huì)優(yōu)先調(diào)用對(duì)象的__str__() 方法,;若沒(méi)有,,就調(diào)用__repr__() 方法;若再?zèng)]有,,則顯示其內(nèi)存地址,。
特別地,對(duì)于下面兩種場(chǎng)景: 用%r進(jìn)行字符串拼接時(shí) 用repr(x)轉(zhuǎn)換對(duì)象x時(shí) 則會(huì)調(diào)用這個(gè)對(duì)象的__repr__() 方法,;若沒(méi)有,,則不再看其是否有__str__() 方法,而是顯示其內(nèi)存地址,。
當(dāng)我們想在不同環(huán)境下支持不同的顯示,,例如終端用戶顯示使用__str__ ,而程序員在開發(fā)期間則使用底層的__repr__ 來(lái)顯示,,實(shí)際上__str__ 只是覆蓋了__repr__ 以得到更友好的用戶顯示,。 參考博客https://www.cnblogs.com/zyyhxbs/p/11184094.html 參考博客https://blog.csdn.net/nanhuaibeian/article/details/86694581
|