前言
本文主要給大家介紹了關于Python中序列的修改、散列與切片的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
Vector類:用戶定義的序列類型
我們將使用組合模式實現 Vector 類,而不使用繼承。向量的分量存儲在浮點數數組中,而且還將實現不可變扁平序列所需的方法。
Vector 類的第 1 版要盡量與前一章定義的 Vector2d 類兼容。
Vector類第1版:與Vector2d類兼容
Vector 類的第 1 版要盡量與前一章定義的 Vector2d 類兼容。然而我們會故意不讓 Vector 的構造方法與 Vector2d 的構造方法兼容。為了編寫 Vector(3, 4) 和 Vector(3, 4, 5) 這樣的代碼,我們可以讓 __init__ 方法接受任意個參數(通過 *args);但是,序列類型的構造方法最好接受可迭代的對象為參數,因為所有內置的序列類型都是這樣做的。
測試 Vector.__init__ 和 Vector.__repr__ 方法
>>> Vector([3.1, 4.2])Vector([3.1, 4.2])>>> Vector((3, 4, 5))Vector([3.0, 4.0, 5.0])>>> Vector(range(10))Vector([0.0, 1.0, 2.0, 3.0, 4.0, ...])
vector_v1.py:從 vector2d_v1.py 衍生而來
from array import arrayimport reprlibimport mathclass Vector: typecode = 'd' def __init__(self, components): self._components = array(self.typecode, components) #self._components是“受保護的”實例屬性,把Vector的分量保存在一個數組中 def __iter__(self): return iter(self._components) #為了迭代,我們使用self._components構建一個迭代器 def __repr__(self): components = reprlib.repr(self._components) #使用reprlib.repr()函數獲取self._components 的有限長度表示形式(如 array('d', [0.0, 1.0, 2.0, 3.0, 4.0, ...])) components = components[components.find('['):-1] #把字符串插入 Vector 的構造方法調用之前,去掉前面的array('d' 和后面的 ) return 'Vecotr({})'.format(components) #直接使用 self._components 構建 bytes 對象 def __str__(self): return str(tuple(self)) def __bytes__(self): return (bytes([ord(self.typecode)]) + bytes(self._components)) def __eq__(self, other): return tuple(self) == tuple(other) def __abs__(self): return math.hypot(sum(x * x for x in self)) #不能使用hypot方法了,因此我們先計算各分量的平方之和,然后再使用sqrt方法開平方 def __bool__(self): return bool(abs(self)) @classmethod def frombytes(cls, octets): typedcode = chr(octets[0]) memv = memoryview(octets[1:]).cast(typedcode) return cls(memv) #我們只需在 Vector2d.frombytes 方法的基礎上改動最后一行:直接把memoryview傳給構造方法,不用像前面那樣使用*拆包協議和鴨子類型
在 Python 中創建功能完善的序列類型無需使用繼承,只需實現符合序列協議的方法。不過,這里說的協議是什么呢?
新聞熱點
疑難解答