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等底层语言实现的。

转载于:https://www.cnblogs.com/mypythonic/p/6882122.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值