01、 特殊方法与多范式
Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来编写相同功能的程序(还有函数式、声明式等,我们暂不深入)。Python的多范式依赖于Python对象中的特殊方法(special method)。
特殊方法名的前后各有两个下划线。特殊方法又被成为魔法方法(magic method),定义了许多Python语法和表达方式,正如我们在下面的例子中将要看到的。当对象中定义了特殊方法的时候,Python也会对它们有“特殊优待”。比如定义了__init__()方法的类,会在创建对象的时候自动执行__init__()方法中的操作。
(可以通过dir()来查看对象所拥有的特殊方法,比如dir(1))
- 运算符
举个例子:
a=(1.8).__mul__(2.0)
print(a)
b=True.__or__(False)
print(b)
输出:
3.6
True
此处的__mul__()与__or__()就相当于*和或运算,是对象自带的方法!
- 内置函数
与运算符类似,许多内置函数也都是调用对象的特殊方法。比如:
len([1,2,3]) # 返回表中元素的总数
实质上做的是:
[1,2,3].__len()__
又如:
(-1).__abs__()
(2.3).__int__()
- 表(list)元素引用
下面是我们常见的表元素引用方式
li=[1,2,3,4]
print(li[3])
上面的程序运行到li[3]的时候,Python发现并理解[]符号,然后调用__getitem__()方法。
li=[1,2,3,4]
print(li.__getitem__(3))
li.__setitem__(3,0)
print(li)
输出:
4
[1, 2, 3, 0]
- 函数
在Python中,函数也是一种对象。实际上,任何一个有__call__()特殊方法的对象都被当作是函数。比如下面的例子:
class SampleMore(object):
def __call__(self, a):
return a+5
add = SampleMore()
print(add(2))
add是SampleMore的一个对象,当被调用时,add执行加5操作
add还可以作为函数对象,被传递给map()函数。
re=list(map(add,[1,2,3]))
print(re)
注:在python3中要看map后的列表要在map()前加上list()