首页 > 代码库 > python深入学习01 特殊方法

python深入学习01 特殊方法

Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来编写相同功能的程序(还有函数式、声明式等,我们暂不深入)。Python的多范式依赖于Python对象中的特殊方法(special method)。

特殊方法名的前后各有两个下划线。特殊方法又被成为魔法方法(magic method),定义了许多Python语法和表达方式。当对象中定义了特殊方法的时候,Python也会对它们有“特殊优待”。比如定义了__init__()方法的类,会在创建对象的时候自动执行__init__()方法中的操作。

(可以通过dir()来查看对象所拥有的特殊方法,比如dir(1))

 

运算符与内置函数


 Python的运算符是通过调用对象的特殊方法实现的。比如:

abc + xyz               # 连接字符串

实际执行了如下操作:

‘abc’.__add__(xyz)

所以,在python中,想知道两个对象是否能相加,先要看两个对象是否相应的__add__()方法。一旦相应的对象有__add__()方法,即使这个对象从数学上不可加,我们都可以用加法的形式,来表达obj.__add__()所定义的操作。在Python中,运算符起到简化书写的功能,但它依靠特殊方法实现。

 

>>> dir(1)[__abs__, __add__, __and__, __class__, __cmp__, __coerce__, __delattr__, __div__, __divmod__, __doc__, __float__, __floordiv__, __format__, __getattribute__, __getnewargs__, __hash__, __hex__, __index__, __init__, __int__, __invert__, __long__, __lshift__, __mod__, __mul__, __neg__, __new__, __nonzero__, __oct__, __or__, __pos__, __pow__, __radd__, __rand__, __rdiv__, __rdivmod__, __reduce__, __reduce_ex__, __repr__, __rfloordiv__, __rlshift__, __rmod__, __rmul__, __ror__, __rpow__, __rrshift__, __rshift__, __rsub__, __rtruediv__, __rxor__, __setattr__, __sizeof__, __str__, __sub__, __subclasshook__, __truediv__, __trunc__, __xor__, bit_length, conjugate, denominator, imag, numerator, real]>>> 1 + 23>>> (1).__add__(2)3>>> 1 - 3-2>>> (1).__sub__(3)-2
>>> (1).__str__()  
‘1‘

 

__call__()


 在Python中,函数也是一种对象。实际上,任何一个有__call__()特殊方法的对象都被当作是函数。这是比较特殊的地方。

 

#!/usr/bin/env pythonclass SampleFunc(object):    def __call__(self, a):        return a + 5add = SampleFunc()     # A function objectprint(add(2))          # Call function    map(add, [2, 4, 5])    # Pass around function object

 

add为SampleMore类的一个对象,当被调用时,add执行加5的操作。add还可以作为函数对象,被传递给map()函数。