# Copyright 2007 Google, Inc. All Rights Reserved.# Licensed to PSF under a Contributor Agreement."""Abstract Base Classes (ABCs) for numbers, according to PEP 3141.TODO: Fill out more detailed documentation on the operators."""from abc import ABCMeta, abstractmethod__all__ = ["Number", "Complex", "Real", "Rational", "Integral"]class Number(metaclass=ABCMeta):"""All numbers inherit from this class.If you just want to check if an argument x is a number, withoutcaring what kind, use isinstance(x, Number)."""__slots__ = ()# Concrete numeric types must provide their own hash implementation__hash__ = None## Notes on Decimal## ----------------## Decimal has all of the methods specified by the Real abc, but it should## not be registered as a Real because decimals do not interoperate with## binary floats (i.e. Decimal('3.14') + 2.71828 is undefined). But,## abstract reals are expected to interoperate (i.e. R1 + R2 should be## expected to work if R1 and R2 are both Reals).class Complex(Number):"""Complex defines the operations that work on the builtin complex type.In short, those are: a conversion to complex, .real, .imag, +, -,*, /, abs(), .conjugate, ==, and !=.If it is given heterogeneous arguments, and doesn't have specialknowledge about them, it should fall back to the builtin complextype as described below."""__slots__ = ()@abstractmethoddef __complex__(self):"""Return a builtin complex instance. Called for complex(self)."""def __bool__(self):"""True if self != 0. Called for bool(self)."""return self != 0@property@abstractmethoddef real(self):"""Retrieve the real component of this number.This should subclass Real."""raise NotImplementedError@property@abstractmethoddef imag(self):"""Retrieve the imaginary component of this number.This should subclass Real."""raise NotImplementedError@abstractmethoddef __add__(self, other):"""self + other"""raise NotImplementedError@abstractmethoddef __radd__(self, other):"""other + self"""raise NotImplementedError@abstractmethoddef __neg__(self):"""-self"""raise NotImplementedError@abstractmethoddef __pos__(self):"""+self"""raise NotImplementedErrordef __sub__(self, other):"""self - other"""return self + -otherdef __rsub__(self, other):"""other - self"""return -self + other@abstractmethoddef __mul__(self, other):"""self * other"""raise NotImplementedError@abstractmethoddef __rmul__(self, other):"""other * self"""raise NotImplementedError@abstractmethoddef __truediv__(self, other):"""self / other: Should promote to float when necessary."""raise NotImplementedError@abstractmethoddef __rtruediv__(self, other):"""other / self"""raise NotImplementedError@abstractmethoddef __pow__(self, exponent):"""self**exponent; should promote to float or complex when necessary."""raise NotImplementedError@abstractmethoddef __rpow__(self, base):"""base ** self"""raise NotImplementedError@abstractmethoddef __abs__(self):"""Returns the Real distance from 0. Called for abs(self)."""raise NotImplementedError@abstractmethoddef conjugate(self):"""(x+y*i).conjugate() returns (x-y*i)."""raise NotImplementedError@abstractmethoddef __eq__(self, other):"""self == other"""raise NotImplementedErrorComplex.register(complex)class Real(Complex):"""To Complex, Real adds the operations that work on real numbers.In short, those are: a conversion to float, trunc(), divmod,%, <, <=, >, and >=.Real also provides defaults for the derived operations."""__slots__ = ()@abstractmethoddef __float__(self):"""Any Real can be converted to a native float object.Called for float(self)."""raise NotImplementedError@abstractmethoddef __trunc__(self):"""trunc(self): Truncates self to an Integral.Returns an Integral i such that:* i>0 iff self>0;* abs(i) <= abs(self);* for any Integral j satisfying the first two conditions,abs(i) >= abs(j) [i.e. i has "maximal" abs among those].i.e. "truncate towards 0"."""raise NotImplementedError@abstractmethoddef __floor__(self):"""Finds the greatest Integral <= self."""raise NotImplementedError@abstractmethoddef __ceil__(self):"""Finds the least Integral >= self."""raise NotImplementedError@abstractmethoddef __round__(self, ndigits=None):"""Rounds self to ndigits decimal places, defaulting to 0.If ndigits is omitted or None, returns an Integral, otherwisereturns a Real. Rounds half toward even."""raise NotImplementedErrordef __divmod__(self, other):"""divmod(self, other): The pair (self // other, self % other).Sometimes this can be computed faster than the pair ofoperations."""return (self // other, self % other)def __rdivmod__(self, other):"""divmod(other, self): The pair (self // other, self % other).Sometimes this can be computed faster than the pair ofoperations."""return (other // self, other % self)@abstractmethoddef __floordiv__(self, other):"""self // other: The floor() of self/other."""raise NotImplementedError@abstractmethoddef __rfloordiv__(self, other):"""other // self: The floor() of other/self."""raise NotImplementedError@abstractmethoddef __mod__(self, other):"""self % other"""raise NotImplementedError@abstractmethoddef __rmod__(self, other):"""other % self"""raise NotImplementedError@abstractmethoddef __lt__(self, other):"""self < other< on Reals defines a total ordering, except perhaps for NaN."""raise NotImplementedError@abstractmethoddef __le__(self, other):"""self <= other"""raise NotImplementedError# Concrete implementations of Complex abstract methods.def __complex__(self):"""complex(self) == complex(float(self), 0)"""return complex(float(self))@propertydef real(self):"""Real numbers are their real component."""return +self@propertydef imag(self):"""Real numbers have no imaginary component."""return 0def conjugate(self):"""Conjugate is a no-op for Reals."""return +selfReal.register(float)class Rational(Real):""".numerator and .denominator should be in lowest terms."""__slots__ = ()@property@abstractmethoddef numerator(self):raise NotImplementedError@property@abstractmethoddef denominator(self):raise NotImplementedError# Concrete implementation of Real's conversion to float.def __float__(self):"""float(self) = self.numerator / self.denominatorIt's important that this conversion use the integer's "true"division rather than casting one side to float before dividingso that ratios of huge integers convert without overflowing."""return self.numerator / self.denominatorclass Integral(Rational):"""Integral adds a conversion to int and the bit-string operations."""__slots__ = ()@abstractmethoddef __int__(self):"""int(self)"""raise NotImplementedErrordef __index__(self):"""Called whenever an index is needed, such as in slicing"""return int(self)@abstractmethoddef __pow__(self, exponent, modulus=None):"""self ** exponent % modulus, but maybe faster.Accept the modulus argument if you want to support the3-argument version of pow(). Raise a TypeError if exponent < 0or any argument isn't Integral. Otherwise, just implement the2-argument version described in Complex."""raise NotImplementedError@abstractmethoddef __lshift__(self, other):"""self << other"""raise NotImplementedError@abstractmethoddef __rlshift__(self, other):"""other << self"""raise NotImplementedError@abstractmethoddef __rshift__(self, other):"""self >> other"""raise NotImplementedError@abstractmethoddef __rrshift__(self, other):"""other >> self"""raise NotImplementedError@abstractmethoddef __and__(self, other):"""self & other"""raise NotImplementedError@abstractmethoddef __rand__(self, other):"""other & self"""raise NotImplementedError@abstractmethoddef __xor__(self, other):"""self ^ other"""raise NotImplementedError@abstractmethoddef __rxor__(self, other):"""other ^ self"""raise NotImplementedError@abstractmethoddef __or__(self, other):"""self | other"""raise NotImplementedError@abstractmethoddef __ror__(self, other):"""other | self"""raise NotImplementedError@abstractmethoddef __invert__(self):"""~self"""raise NotImplementedError# Concrete implementations of Rational and Real abstract methods.def __float__(self):"""float(self) == float(int(self))"""return float(int(self))@propertydef numerator(self):"""Integers are their own numerators."""return +self@propertydef denominator(self):"""Integers have a denominator of 1."""return 1Integral.register(int)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。