Python 魔术方法.

'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)的操作,那么它就有具体__len__的实现。

import os    ==> __import__('os')

 

如果对builtins感兴趣的话,你会发现在python/lib是找不到对应得python实现的。这些builtins是用C等底层语言实现的。

posted @ 2017-05-20 14:42  Haichao_cn_blog  阅读(357)  评论(0编辑  收藏  举报