문제

기본적으로 나는 모든 표준 Python Int 연산자에게 액세스하고 싶습니다. __and__ 그리고 __xor__ 등, 특히 결과가 인쇄 될 때마다 16 진 형식으로 표시되고 싶습니다. (내 계산기를 16 진수 모드에 넣는 것과 같은 종류)

class Hex(int):
  def __repr__(self):
    return "0x%x"%self
  __str__=__repr__ # this certainly helps with printing

if __name__=="__main__":
  print Hex(0x1abe11ed) ^ Hex(440720179)
  print Hex(Hex(0x1abe11ed) ^ Hex(440720179))

이상적으로 두 출력 라인은 16 진수이어야합니다 : 0xfacade, 그러나 첫 번째는 10 진수를 얻습니다 : 16435934

어떤 아이디어?

도움이 되었습니까?

해결책

귀하의 의견에 대한 응답으로 :

혼자서 믹스 인을 쓸 수 있습니다.

class IntMathMixin:
    def __add__(self, other):
        return type(self)(int(self).__add__(int(other)))
    # ... analog for the others

그런 다음 다음과 같이 사용하십시오.

class Hex(IntMathMixin, int):
    def __repr__(self):
         return "0x%x"%self
    __str__=__repr__ 

다른 팁

당신은 정의해야합니다 __repr__ 그리고 __str__ 갈라져:

class Hex(int):
  def __repr__(self):
    return "Hex(0x%x)" % self
  def __str__(self):
    return "0x%x" % self

그만큼 __repr__ 함수 (가능하면) Python 텍스트를 제공해야합니다. eval()원래 객체를 재구성하기 위해 반면에, __str__ 인간의 읽기 가능한 대상 표현을 반환 할 수 있습니다.

클래스 데코레이터, 특히 Python 2.6 이상에서는 "슈퍼 클래스의 인스턴스가 아닌이 클래스 유형의 인스턴스를 반환하는 많은 방법을 포장하는 가장 어려운 방법입니다. ~와 함께 __str__ vs __repr__, 당신의 문제에 대한 가치가 있지만 전혀 해결되지는 않습니다 ;-).

def returnthisclassfrom(specials):
  specialnames = ['__%s__' % s for s in specials.split()]
  def wrapit(cls, method):
    return lambda *a: cls(method(*a))
  def dowrap(cls):
    for n in specialnames:
      method = getattr(cls, n)
      setattr(cls, n, wrapit(cls, method))
    return cls
  return dowrap

@returnthisclassfrom('and or xor')
class Hex(int):
  def __repr__(self): return hex(self)
  __str__ = __repr__

a = Hex(2345)
b = Hex(5432)
print a, b, a^b

Python 2.6에서는 방출됩니다

0x929 0x1538 0x1c11

바라는대로. 물론 데코레이터 등에 더 많은 메소드 이름을 추가 할 수 있습니다. Python 2.5에 갇힌 경우 장식 라인을 제거하십시오 (시작 라인 @)) 그리고 대신 사용하십시오

class Hex(int):
  def __repr__(self): return hex(self)
  __str__ = __repr__
Hex = returnthisclassfrom('and or xor')(Hex)

진드기는 덜 우아하지만 효과적입니다 ;-)

편집하다: 코드에서 "일반적인 범위 문제"의 발생을 수정했습니다.

육각형 인스턴스를 반환하려면 연산자 (+, -, ** 등)를 가져와야합니다. 그대로, 그것은 int를 반환합니다

class Hex(int):
    def __repr__(self):
        return "Hex(0x%x)" % self
    def __str__(self):
        return "0x%x" % self
>>> h1 = Hex(100)
>>> h2 = Hex(1000)
>>> h1
Hex(0x64)
>>> h2
Hex(0x3e8)
>>> h1+h2
1100
>>> type(h1+h2)
<type 'int'>

따라서 다양한 운영자를 무시할 수 있습니다.

class Hex(int):
    def __repr__(self):
        return "Hex(0x%x)" % self
    def __str__(self):
        return "0x%x" % self
    def __add__(self, other):
        return Hex(super(Hex, self).__add__(other))
    def __sub__(self, other):
        return self.__add__(-other)
    def __pow__(self, power):
        return Hex(super(Hex, self).__pow__(power))
    def __xor__(self, other):
        return Hex(super(Hex, self).__xor__(other))

>>> h1 = Hex(100)
>>> h2 = Hex(1000)
>>> h1+h2
Hex(0x44c)
>>> type(h1+h2)
<class '__main__.Hex'>
>>> h1 += h2
>>> h1
Hex(0x44c)
>>> h2 ** 2
Hex(0xf4240)
>>> Hex(0x1abe11ed) ^ Hex(440720179)
>>> Hex(0xfacade)

나는 이것에 대해 모른다. 나는 인스턴스를 반환하기 위해 모든 운영자를 무시하지 않고 더 나은 방법이 있어야한다고 생각한다. Hex???

우세하다 __str__ 또한.

__repr__ repl (o)가 호출 될 때 사용되며 대화식 프롬프트에서 값을 표시하는 데 사용됩니다. __str__ 인쇄 시점을 포함하여 대부분의 개체를 포함하는 대부분의 인스턴스를 요구합니다.

기본값 __str__ 대상에 대한 행동은 repr, 하지만 int 자체를 제공합니다 __str__ 방법 (동일합니다 __repr__ (Python 3 이전) 뒤로 물러서 에게 __repr__).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top