子类化int以获得十六进制表示

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

有任何想法吗?

Gre*_*ill 7

您应该定义__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__可以返回对象的人类可读表示.


Ale*_*lli 6

类装饰,尤其是在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)

一个不太优雅的螨虫,但同样有效;-)

编辑:修复了代码中"通常的范围问题"的出现.