Python 的對象天生擁有一些神奇的方法,它們總被雙下劃線所包圍,它們是面向對象的 Python 的一切。它們是可以給你的類增加魔力的特殊方法,如果你的對象實現(重載)了某一個魔法方法,那麼這個方法就會在特殊的情況下自動被 Python 所調用。
定義對象被 str()函數調用時的行為, 一般面向程序使用者。
self 代表對象本身。
必須是字符串,否則拋出異常。
示例
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
if __name__ == "__main__":
p = Point(3, 4)
print(p)
執行結果:
<__main__.Point object at 0x000001FD666F7B50>
這段代碼中定義了一個簡單的類,它當中有 x 和 y 兩個元素,但是如果直接運行的話,屏幕上會輸出一個地址。這個結果是解釋器在執行的時候這個實例的一些相關信息,但幾乎沒有參考意義,我們想要的是這個實例當中具體的值,而不是一個內存當中的地址。
想要實現這個功能,有很多方法,其中之一是__str__。
__str__方法類似於Java當中的toString方法,可以根據需要返回實例轉化成字符串之後的結果。
比如,可以在類當中重載這個方法,就可以根據需要輸出結果了:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f'x: {self.x}, y: {self.y}'
if __name__ == "__main__":
p = Point(3, 4)
print(p)
執行結果:
x: 3, y: 4
再看如下示例:
class MyText:
name = 1
# def __repr__(self) -> str:
# return '嗯哼'
def __str__(self):
return 'My is str'
sample = MyText()
print(sample) # My is str
print(str(sample)) # My is str
執行結果:
My is str
My is str
__repr__和__str__方法的總結:
1、如果 __repr__和__str__都沒有被定義, 那麼print(對象),print(str(對象)),print(repr(對象))都會輸出對象的地址。
2、如果只有__repr__被定義,那麼那麼print(對象),print(str(對象)),print(repr(對象))都會輸出該方法的返回值。
3、如果只有__str__被定義,那麼print(對象)和print(str(對象))會輸出該方法的返回值,print(repr(對象))會輸出對象的地址。
4、如果兩個都被定義,那麼print(對象)會輸出__str__方法的返回值,print(str(對象)),print(repr(對象))會輸出各自方法的返回值。
簡單來說,__str__可以被__repr__代替(__str__沒有定義時),反之不行,但__str__的優先級更高。