1. 程式人生 > >python中的 __repr__和__str__

python中的 __repr__和__str__

__repr__,被內建函式repr用於把一個物件用"官方"的字串形式表示出來(終端友好)    1、值傳給eval()來返回一個物件的字串表示形式    2、否則返回一個尖括號括起來的字串,包含了物件型別的名稱和附加的資訊通常包括物件的名稱和地址    3、一個類可以通過 __repr__方法來控制它的例項返回內容(也就是以上兩點都通可以通過__repr__方法來定製)    4、返回 Unicode 字串(str 型別)    __str__,被str(object) 和內建函式format()和print() 返回一個物件的'非正式'字串形式(使用者友好)    1、返回一個物件的字串版本,如果物件沒有提供,會返回空字串,    2、對於字串,會返回字串本身,如果物件沒有提供__str__方法,會使用__repr__方法(也就是repr(object))來提供返回值    3、返回 Unicode 字串(str 型別)例子:這是django query的原始碼部分,使用__repr__來返回一個物件和查詢的資料切片:

    def __repr__(self):
        data = list(self[:REPR_OUTPUT_SIZE + 1])
        if len(data) > REPR_OUTPUT_SIZE:
            data[-1] = "…(remaining elements truncated)…"
        return '<%s %r>' % (self.__class__.__name__, data)

    注意:這裡用到了%r,會返回資料的標準字串形式,它和%s的區別看下面的例子:

    In [58]: repr(datetime.datetime.now())
    Out[
58]: 'datetime.datetime(2018, 9, 13, 15, 22, 22, 124128)' In [59]: str(datetime.datetime.now()) Out[59]: '2018-09-13 15:22:26.310367'

再來看下__str__和__repr__的實現:

   In [68]: class example:
    ...:     def __str__(self):
    ...:         return 'str'
    ...:     def __repr__(self):
    ...:         
return 'repr' ...: In [69]: a=example() In [70]: print(a) str In [71]: a Out[71]: repr In [74]: '{}'.format(a.__str__()) Out[74]: 'str' In [75]: '{}'.format(a.__repr__()) Out[75]: 'repr'

如果物件沒有__str__方法,會使用__repr__來代替:

In [76]: class example:
    ...:     def __repr__(self):
    ...:         return 'repr'
    ...:

In [77]: a=example()

In [78]: print(a)
repr

In [79]: '{}'.format(a.__str__())
Out[79]: 'repr'

 所以如果我們只實現兩個中的一個的話,只需要寫__repr__就可以了        參考:    https://docs.python.org/3/reference/datamodel.html    https://docs.python.org/3/library/functions.html#repr    https://docs.python.org/3/library/stdtypes.html#str    https://github.com/django/django/blob/master/django/db/models/query.py