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 objetoint
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.