python筆記70 - Python中`__repr__`和`__str__`區別


前言

Python中__repr____str__使用區別

__repr__ 使用

很多時候我們在創建一個類的時候,在終端打印類的實例,看到的是一個類似於這樣的內容:<XXX object at 0x0000000001222E10>

class MyDefined(object):

    def __init__(self):
        self.name = "yoyo"

在終端調試結果

>python
Python 3.6.6
>>> from a import MyDefined
>>> yo=MyDefined()
>>> yo
<a.MyDefined object at 0x0000015EEEB1F0B8>
>>>

返回的是對象的內存地址,對於初學者看起來很不友善,初學者無法理解返回的內容,於是可以加一個__repr__ 方法

class MyDefined(object):

    def __init__(self):
        self.name = "yoyo"

    def __repr__(self):
        return '<object MyDefined: {}>'.format(self.name)

重新在終端調試

>python
Python 3.6.6 
>>> from a import MyDefined
>>> yo=MyDefined()
>>> yo
<object MyDefined: yoyo>
>>> print(yo)
<object MyDefined: yoyo>

從打印的結果就可以看到返回的是<object MyDefined: yoyo>,這樣用戶就知道返回的是什么實例對象,便於開發者理解。
__repr__是直接輸出對象(面向開發者),方便提供接口給開發者使用,如django里面的ORM查詢,返回queryset對象。

__str__ 使用

__str__方法是在print()打印的時候輸出給用戶看的,面向的是普通的用戶,方便用戶知道返回的是什么實例對象。

class MyDefined(object):

    def __init__(self):
        self.name = "yoyo"

    def __str__(self):
        return '<object MyDefined: {}>'.format(self.name)

在終端調試

>python
Python 3.6.6 
>>> from a import MyDefined
>>> yo=MyDefined()
>>> yo
<a.MyDefined object at 0x000001A4C133F128>
>>> print(yo)
<object MyDefined: yoyo>
>>>

從結果可以看到直接輸入yo,返回的還是object at 0x000,只有print()輸出的時候才會打印__str__返回的內容

總結

注意:__str__()方法和__repr__()方法的返回值只能是字符串!
__repr____str__這兩個方法都是用於顯示的,__str__是面向用戶的,而__repr__面向開發者

關於調用兩種方法的時機

  • 使用print()時
  • 使用%s和f'{}'拼接對象時
  • 使用str(x)轉換對象x時
    在上述三種場景中,會優先調用對象的__str__()方法;若沒有,就調用__repr__()方法;若再沒有,則顯示其內存地址。

特別地,對於下面兩種場景:

  • 用%r進行字符串拼接時
  • 用repr(x)轉換對象x時
    則會調用這個對象的__repr__()方法;若沒有,則不再看其是否有__str__()方法,而是顯示其內存地址。

當我們想在不同環境下支持不同的顯示,例如終端用戶顯示使用__str__,而程序員在開發期間則使用底層的__repr__來顯示,實際上__str__只是覆蓋了__repr__以得到更友好的用戶顯示。

參考博客https://www.cnblogs.com/zyyhxbs/p/11184094.html
參考博客https://blog.csdn.net/nanhuaibeian/article/details/86694581


免責聲明!

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



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