2010-07-13 9 views
34

Estoy interesado en crear una subclase del tipo incorporado int en Python (estoy usando v. 2.5), pero tengo algunos problemas para que funcione la inicialización.Subclassing int en Python

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 utilizar este recibo:

>>> a = TestClass() 
>>> a 
0 

donde yo esperaría que el resultado sea 5.

¿Qué estoy haciendo mal? Google, hasta ahora, no ha sido muy útil, pero no estoy muy seguro de lo que debería ser la búsqueda de

+2

Esta pregunta StackOverflow cubre el mismo tema con más detalle: http: //stackoverflow.com/questions/33534/extending-base-classes-in-python – sunetos

+0

También, aquí: http://stackoverflow.com/questions/399022/why-cant-i-subclass-datetime-date – Arkady

Respuesta

54

int es inmutable por lo que no se puede modificar una vez creada, utilice __new__ lugar

class TestClass(int): 
    def __new__(cls, *args, **kwargs): 
     return super(TestClass, cls).__new__(cls, 5) 

print TestClass() 
3

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í es 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 'positiva'

Cuestiones relacionadas