1. 程式人生 > >Python 魔術方法.

Python 魔術方法.

方法 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 魔術方法.