實際案例:
我們想自定義一種新類型的元組,對於傳入的可迭代對象,只保留其中int類型且值大於0的元素,例如:IntTuple([1, -1, 'abc', 6, ['x', 'y'], 3]) => (1, 6, 3)。
派生IntTuple新類型目的就是改變內置元組的實例化行為,因為內置元組傳入[1, -1, 'abc', 6, ['x', 'y'], 3]可迭代對象之後,每一個元素都將進入到元組當中目前不是所希望的。
要求IntTuple是內置tuple的子類,如何實現?
解決方案:
定義類IntTuple繼承內置tuple,並實現__new__,修改實例化行為。
class IntTuple(tuple): # 繼承內置tuple
# 靜態構造方法,__new__會先於__init__被調用
# 實現tuple的過濾,cls為類對象
def __new__(cls, iterable):
# 使用生成器解析,過濾非int且小於0的數據
g = (x for x in iterable if isinstance(x, int) and x > 0)
return super(IntTuple, cls).__new__(cls, g)
t = IntTuple([1, -1, 'abc', 6, ['x', 'y'], 3])
print(t)
# 輸出結果:
(1, 6, 3)