如何使用python中的特殊方法

引子:本文是根據《流暢的python》中第1.2節 如果使用特殊方法整理的,在1.1節(一摞python風格的撲克牌)中僅實現了__len__和__getitem__兩個特殊函數,就具有大部分python中的列表的功能,比如迭代,in, 切片等等。本節繼續深入特殊函數,以二維向量為例展示特殊函數強大功能更。

如何使用python中的特殊方法

在python 中的特殊方法(也稱Magic method)往往是以__(雙下劃線)開頭,以__(雙下劃線)結尾的,例如__len__()方法。對於這些特殊方法,我們不會用到,哪為啥還要定義呢?但是我們會用len()函數啊,我們使用len()函數時,解釋器就會調用__len__()函數,所以還是有用的,只是間接使用。

本節案例是以二維向量(vector)類為例,實現了__add__, __mul__,__bool__,__abs__, __repr__函數。同時在測試用例展示了調用的結果。


<code>import math


class Vector:
'''
Vector是對於矢量的表示,僅包含x,y兩個元素。實現了特殊函數有:
__add__, __bool__, __mul__, __abs__, __repr__
其中這些特殊函數均是python解釋器調用的,但是對於開發人員,對應的函數分別為:
+, bool(), *, abs(), repr()
測試用例
>>> vector1 = Vector(2, 1)
>>> vector2 = Vector(3, 4)
>>> print(vector1 + vector2)
Vector(5, 5)
>>> print(vector1 * 3)
Vector(6, 3)
>>> bool(vector1)
True
>>> abs(vector2)
5.0

'''

def __init__(self, x, y):
self.x = x
self.y = y

def __bool__(self):
return bool(abs(self))

def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)

def __abs__(self):
""" Return the Euclidean distance, sqrt(x*x + y*y)."""
return math.hypot(self.x, self.y)

def __repr__(self):
return 'Vector(%r, %r)' % (self.x, self.y)

def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)


if __name__ == '__main__':
import doctest
doctest.testmod(verbose=True)
/<code>


1.__add__函數實現了 vector 對象“+”的操作,

2.__abs__實現了取模的操作,其中math.hypot()函數是求歐式距離的函數。

3.__repr__是求對象的字符串表示。這裡還是和__str__是有區別的,至於有哪些,另做一篇介紹。

4.__mul__是求向量同常數相乘的操作

5.__bool__對於取模為0的返回False,其他為True


分享到:


相關文章: