Python 魔術方法.
阿新 • • 發佈:2017-05-20
方法 pla 字符串 play bject ins 發現 報錯 如果
‘123‘ + ‘456‘ ‘123‘.__add__.‘456‘
Python 中,這兩個語句是等價的。具體的說,第二句是第一句的具體實現。當處理‘+’的時候,Python 會去‘+’號的左側的object尋找是否有__add__的魔術方法。如果這個object有__add__的具體實現, 那麽這個object就支持加法的操作。 ‘123’是字符串,也是str類型的object,那麽我們推測它肯定有__add__方法:
>>> type(‘123‘) <type ‘str‘> >>> dir(‘123‘) [‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘_
個人感覺Python的魔術方法是一種比較漂亮的方法,如果想要支持某種內置的操作,只要去實現對應的方法即可。
很顯然,下面的代碼會報錯。
class MyObject(object): def __init__(self, name): self.name = name my_object1 = MyObject(‘Hello‘) my_object2 = MyObject(‘World‘) my_object1 + my_object2
Output:
my_object1 + my_object2 TypeError: unsupported operand type(s) for +: ‘MyObject‘ and ‘MyObject‘
實現了__add__魔術方法之後呢?
class MyObject(object): def __init__(self, name): self.name = name def __add__(self, other): return self.name + other.name my_object1 = MyObject(‘Hello‘) my_object2 = MyObject(‘World‘) print(my_object1 + my_object2)
Output:
HelloWorld
Python tutor
如果一個object是class, 那麽使用dir(object) 命令,就能發現它有__class__的method。
如果一個object支持str(object)的操作,那麽它就有具體__str__的實現。
如果一個object支持len(object)的操作,那麽它就有具體__str__的實現。
Python 魔術方法.