Cómo agregar soporte para la función hexadecimal a la clase

He escrito una clase que implementa el método __int__ para que una instancia pueda comportarse como un entero:

 class MyClass: def __init__(self, value): self._value = value def __int__(self): return self._value 

Usar la función int en una instancia funciona bien, y pensé que otras funciones integradas dependían implícitamente de ella, por ejemplo, hex . Sin embargo, me sale el siguiente mensaje de error:

 >>> x = MyClass(5) >>> int(x) 5 >>> hex(x) TypeError: 'MyClass' object cannot be interpreted as an integer 

Intenté implementar el método __hex__ de la misma manera que __int__ , pero esto no tuvo ningún efecto.

¿Qué tengo que hacer para que las instancias de mi clase sean aceptadas por hex ?

Como se especifica en la documentación para hex(..) , debe definir el método __index__ :

hex(x)

(..)

Si x no es un objeto int Python, debe definir un __index__() que devuelve un entero .

(parte omitida, formateada)

Así que para tu caso eso es probablemente:

 class MyClass: def __init__(self, value): self._value = value def __int__(self): return self._value def __index__(self): return self.__int__() #note you do not have to return the same as __int__ 

Al ejecutar esto en la consola:

 $ python3 Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> class MyClass: ... def __init__(self, value): ... self._value = value ... ... def __int__(self): ... return self._value ... ... def __index__(self): ... return self.__int__() ... >>> foo=MyClass(14) >>> hex(foo) '0xe' 

En caso de que desee que el “valor” del hex(..) sea ​​otra cosa, puede definir __index__ diferente de __int__ aunque le __int__ no lo __int__ . hex(..) además garantiza que devolverá una cadena ( str ) que es un número hexadecimal con formato correcto: no puede devolver, por ejemplo, una tupla, etc. De lo contrario, generará un TypeError . Por ejemplo:

 Traceback (most recent call last): File "", line 1, in  TypeError: __index__ returned non-int (type tuple) 

si __index__ devuelve una tupla.