Subclassing int en Python
inheritance python-2.5 (2)
Aunque es correcto, las respuestas actuales posiblemente no estén completas.
p.ej
a = TestClass()
b = a - 5
print type(b)
Mostraría b como un entero, donde es posible que desee que sea una TestClass.
Aquí hay una respuesta mejorada
class positive(int):
def __new__(cls, value, *args, **kwargs):
if value < 0:
raise ValueError, "positive types must not be less than zero"
return super(positive, cls).__new__(cls, value)
def __add__(self, other):
res = super(positive, self).__add__(other)
return self.__class__(max(res, 0))
def __sub__(self, other):
res = super(positive, self).__sub__(other)
return self.__class__(max(res, 0))
def __mul__(self, other):
res = super(positive, self).__mul__(other)
return self.__class__(max(res, 0))
def __div__(self, other):
res = super(positive, self).__div__(other)
return self.__class__(max(res, 0))
Ahora el mismo tipo de prueba
a = positive(10)
b = a - 9
print type(b)
imprimiría ''positivo''
Estoy interesado en crear una subclase del tipo de int
integrado en Python (estoy usando v. 2.5), pero tengo algunos problemas para que la inicialización funcione.
Aquí hay un código de ejemplo, que debería ser bastante obvio.
class TestClass(int):
def __init__(self):
int.__init__(self, 5)
Sin embargo, cuando trato de usar esto obtengo:
>>> a = TestClass()
>>> a
0
donde esperaría que el resultado fuera 5
.
¿Qué estoy haciendo mal? Hasta ahora, Google no ha sido de mucha ayuda, pero no estoy seguro de qué debería buscar.
int
es inmutable, por lo que no puede modificarlo después de haberlo creado, use __new__
en __new__
lugar
class TestClass(int):
def __new__(cls, *args, **kwargs):
return super(TestClass, cls).__new__(cls, 5)
print TestClass()