하위 클래싱 int hex 표현을 얻기 위해
-
12-09-2019 - |
문제
기본적으로 나는 모든 표준 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__
).