在 Python 中有种特殊方法,也称为魔法方法。特殊方法的方法名的前后各有两个下划线,如__init__,这种拼写表示名字有特殊的意义。如果类实现了这些方法中的某一个,那么这个方法会在特殊的情况下被调用。
可以使用 dir() 查看对象实现的特殊方法。
>>> dir(list) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
当类实现了 __init()__ 方法,在创建对象的时候会自动调用 __init()__ 方法。
当使用运算符进行运算的时候,实际上是通过调用对象的特殊方法实现的,如:
[1, 2] + [3, 4, 5]
实际执行的操作是:
[1, 2].__add__([3, 4, 5])
所以,如果想实现类似于 C++ 中的运算符重载,让自定义的类对象通过运算符进行运算,只要在自定义的类中实现相应的特殊方法即可:
class MyObject(object): def __init__(self, size = 0): super(MyObject, self).__init__() self.size = size def __add__(self, obj): if isinstance(obj, MyObject) : return MyObject(self.size + obj.size) else : raise TypeError('can only concatenate MyObject (not "%s") to MyObject' % type(obj)) obj = MyObject(2) + MyObject(3) print obj.size
许多内置函数也是调用对象的特殊方法,如:
len('hello world')
实际执行的操作是
'hello world'.__len__()
在 Python 中,一切皆对象,函数也是一个对象。实际上,实现了 __call__() 方法的对象都可以当作一个函数。
class Square(object): def __call__(self, n): return n ** 2 square = Square() print square(10)