numbers — 숫자 추상 기본 클래스

numbers — 숫자 추상 기본 클래스

numbers 모듈은 PEP 3141에서 정의한 숫자 추상 기본 클래스 계층을 제공해요. 이 클래스들은 점점 더 많은 연산을 정의하도록 단계적으로 확장돼요. 이 모듈에 정의된 어떤 타입도 인스턴스화하도록 의도되지 않았어요.

출처: Python documentation

본문

  • class numbers.Number — 숫자 계층의 뿌리예요. 인자 x 가 숫자인지, 어떤 종류든 상관없이 그냥 확인하려면 isinstance(x, Number) 를 사용해요.

숫자 탑 (The numeric tower)

  • class numbers.Complex — 이 타입의 하위 클래스는 복소수를 설명하며 내장 complex 타입에서 동작하는 연산들을 포함해요. 여기에는 complexbool 로의 변환, real, imag, +, -, *, /, **, abs(), conjugate(), ==, != 가 있어요. -!= 를 제외한 모두가 추상(abstract)이에요.
    • real — 추상. 이 숫자의 실수부를 가져와요.
    • imag — 추상. 이 숫자의 허수부를 가져와요.
    • abstractmethod conjugate() — 추상. 켤레 복소수를 반환해요. 예를 들어 (1+3j).conjugate() == (1-3j).
  • class numbers.RealComplex 에 더해 Real 은 실수에서 동작하는 연산들을 추가해요. 간단히 말해 float 로의 변환, math.trunc(), round(), math.floor(), math.ceil(), divmod(), //, %, <, <=, >, >= 를 추가해요. Realcomplex(), real, imag, conjugate() 에 대한 기본값도 제공해요.
  • class numbers.RationalReal 을 하위 타입으로 하면서 numerator(분자)와 denominator(분모) 프로퍼티를 추가해요. float() 에 대한 기본값도 제공해요. numeratordenominator 값은 Integral 인스턴스여야 하며, denominator 가 양수인 기약분수(최저항) 상태여야 해요.
    • numerator — 추상. 이 유리수의 분자.
    • denominator — 추상. 이 유리수의 분모.
  • class numbers.IntegralRational 을 하위 타입으로 하면서 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)

# ...

더 알아보기 (Learn more)