翻譯自 這裡
Preface :
New in version 2.6.
numbers 模組 (PEP 3141) 定義了階層式的 abstract base classes. 首先來看在此模組最頂層的類別 :
- class numbers.Number
The numeric tower :
接著來看模組定義的其它類別 :
- class numbers.Complex (複數)
- class numbers.Real (實數)
- class numbers.Rational (有理數)
- class numbers.Integral (整數)
Notes for type implementors :
在實作這些抽象類別時需要注意某些地方. 首先就是同樣數值大小的 __equal__() 與 __hash__() 返回的值也必須要一樣! 可以參考下面 fractions.Fraction 如何實作 hash() 當作參考 :
- Implementing the arithmetic operations
在你繼承 Integral 並實作上面的方法時, 需要注意方法 __add__() 與 __radd__() 的差別, 底下為範例代碼 :
接著我們要來看看 __radd__() 方法中的 if/else 區塊. 假設我們有定義類別 A, B 繼承自
Integer ; 而 A 的生成物件為 a, B 的生成物件 b, 考慮 a + b :
因為類似的邏輯可以應用在許多運算子上, 所以透過底下的轉換便可以將這樣的邏輯替換到許多運算子對應的函數上面 (參考自 fractions.Fraction):
Preface :
New in version 2.6.
numbers 模組 (PEP 3141) 定義了階層式的 abstract base classes. 首先來看在此模組最頂層的類別 :
- class numbers.Number
The numeric tower :
接著來看模組定義的其它類別 :
- class numbers.Complex (複數)
- class numbers.Real (實數)
- class numbers.Rational (有理數)
- class numbers.Integral (整數)
Notes for type implementors :
在實作這些抽象類別時需要注意某些地方. 首先就是同樣數值大小的 __equal__() 與 __hash__() 返回的值也必須要一樣! 可以參考下面 fractions.Fraction 如何實作 hash() 當作參考 :
- def __hash__(self):
- if self.denominator == 1:
- # Get integers right.
- return hash(self.numerator)
- # Expensive check, but definitely correct.
- if self == float(self):
- return hash(float(self))
- else:
- # Use tuple's hash to avoid a high collision rate on
- # simple fractions.
- return hash((self.numerator, self.denominator))
在你繼承 Integral 並實作上面的方法時, 需要注意方法 __add__() 與 __radd__() 的差別, 底下為範例代碼 :
- class MyIntegral(Integral):
- def __add__(self, other):
- if isinstance(other, MyIntegral):
- return do_my_adding_stuff(self, other)
- elif isinstance(other, OtherTypeIKnowAbout):
- return do_my_other_adding_stuff(self, other)
- else:
- return NotImplemented
- def __radd__(self, other):
- if isinstance(other, MyIntegral):
- return do_my_adding_stuff(other, self)
- elif isinstance(other, OtherTypeIKnowAbout):
- return do_my_other_adding_stuff(other, self)
- elif isinstance(other, Integral):
- return int(other) + int(self)
- elif isinstance(other, Real):
- return float(other) + float(self)
- elif isinstance(other, Complex):
- return complex(other) + complex(self)
- else:
- return NotImplemented
因為類似的邏輯可以應用在許多運算子上, 所以透過底下的轉換便可以將這樣的邏輯替換到許多運算子對應的函數上面 (參考自 fractions.Fraction):
- def _operator_fallbacks(monomorphic_operator, fallback_operator):
- def forward(a, b):
- if isinstance(b, (int, long, Fraction)):
- return monomorphic_operator(a, b)
- elif isinstance(b, float):
- return fallback_operator(float(a), b)
- elif isinstance(b, complex):
- return fallback_operator(complex(a), b)
- else:
- return NotImplemented
- forward.__name__ = '__' + fallback_operator.__name__ + '__'
- forward.__doc__ = monomorphic_operator.__doc__
- def reverse(b, a):
- if isinstance(a, Rational):
- # Includes ints.
- return monomorphic_operator(a, b)
- elif isinstance(a, numbers.Real):
- return fallback_operator(float(a), float(b))
- elif isinstance(a, numbers.Complex):
- return fallback_operator(complex(a), complex(b))
- else:
- return NotImplemented
- reverse.__name__ = '__r' + fallback_operator.__name__ + '__'
- reverse.__doc__ = monomorphic_operator.__doc__
- return forward, reverse
- def _add(a, b):
- """a + b"""
- return Fraction(a.numerator * b.denominator +
- b.numerator * a.denominator,
- a.denominator * b.denominator)
- __add__, __radd__ = _operator_fallbacks(_add, operator.add)
- # ...
沒有留言:
張貼留言