numbers — 숫자 추상 기본 클래스
numbers — 숫자 추상 기본 클래스
numbers 모듈은 PEP 3141에서 정의한 숫자 추상 기본 클래스 계층을 제공해요. 이 클래스들은 점점 더 많은 연산을 정의하도록 단계적으로 확장돼요. 이 모듈에 정의된 어떤 타입도 인스턴스화하도록 의도되지 않았어요.
본문
- class numbers.Number — 숫자 계층의 뿌리예요. 인자 x 가 숫자인지, 어떤 종류든 상관없이 그냥 확인하려면
isinstance(x, Number)를 사용해요.
숫자 탑 (The numeric tower)
- class numbers.Complex — 이 타입의 하위 클래스는 복소수를 설명하며 내장
complex타입에서 동작하는 연산들을 포함해요. 여기에는complex와bool로의 변환,real,imag,+,-,*,/,**,abs(),conjugate(),==,!=가 있어요.-와!=를 제외한 모두가 추상(abstract)이에요.- real — 추상. 이 숫자의 실수부를 가져와요.
- imag — 추상. 이 숫자의 허수부를 가져와요.
- abstractmethod conjugate() — 추상. 켤레 복소수를 반환해요. 예를 들어
(1+3j).conjugate() == (1-3j).
- class numbers.Real —
Complex에 더해Real은 실수에서 동작하는 연산들을 추가해요. 간단히 말해float로의 변환,math.trunc(),round(),math.floor(),math.ceil(),divmod(),//,%,<,<=,>,>=를 추가해요.Real은complex(),real,imag,conjugate()에 대한 기본값도 제공해요. - class numbers.Rational —
Real을 하위 타입으로 하면서numerator(분자)와denominator(분모) 프로퍼티를 추가해요.float()에 대한 기본값도 제공해요.numerator와denominator값은Integral인스턴스여야 하며,denominator가 양수인 기약분수(최저항) 상태여야 해요.- numerator — 추상. 이 유리수의 분자.
- denominator — 추상. 이 유리수의 분모.
- class numbers.Integral —
Rational을 하위 타입으로 하면서int로의 변환을 추가해요.float(),numerator,denominator에 대한 기본값을 제공해요. 나머지(modulus)가 있는pow()와 비트 문자열 연산<<,>>,&,^,|,~에 대한 추상 메서드를 추가해요.
타입 구현자들을 위한 참고 사항 (Notes for type implementers)
구현자는 같은 값을 가진 숫자들이 같게 비교되고 같은 값으로 해시되도록 주의해야 해요. 실수의 서로 다른 두 확장이 존재하면 이는 미묘할 수 있어요. 숫자 타입의 해싱도 참고하세요.
산술 연산 구현 (Implementing the arithmetic operations)
이는 __add__() 와 __radd__() 를 다음과 같이 정의해야 한다는 뜻이에요. 호환되지 않는 타입이 오면 연산자 폴백(operator fallback)을 사용해 float 또는 complex 로 변환해 계산하고, 그마저도 안 되면 NotImplemented 를 반환해요.
return fallback_operator(float(a), float(b))
elif isinstance(a, 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)
# ...