2 python hex representation subclassing
基本上我想访问所有标准蟒INT运营商,例如__and__和__xor__等,具体而言,每当结果终于印刷我希望它在十六进制格式表示.(有点像把我的计算器放到十六进制模式)
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))
Run Code Online (Sandbox Code Playgroud)
理想情况下,两行输出应为十六进制:0xfacade,但第一行输出十进制:16435934
有任何想法吗?
您应该定义__repr__和__str__分开:
class Hex(int):
def __repr__(self):
return "Hex(0x%x)" % self
def __str__(self):
return "0x%x" % self
Run Code Online (Sandbox Code Playgroud)
该__repr__函数应该(如果可能的话)提供可以eval()用来重建原始对象的Python文本.另一方面,__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
Run Code Online (Sandbox Code Playgroud)
在Python 2.6中,这会发出
0x929 0x1538 0x1c11
Run Code Online (Sandbox Code Playgroud)
如预期的.当然你可以为装饰器添加更多方法名等; 如果您坚持使用Python 2.5,请删除装饰线(以开头的那个@)并改为使用
class Hex(int):
def __repr__(self): return hex(self)
__str__ = __repr__
Hex = returnthisclassfrom('and or xor')(Hex)
Run Code Online (Sandbox Code Playgroud)
一个不太优雅的螨虫,但同样有效;-)
编辑:修复了代码中"通常的范围问题"的出现.