Quiero crear una subclase de un tipo numérico (digamos, int) en python y darle un constructor complejo brillante. Algo como esto:¿Cómo agregar un constructor a un tipo numérico subclasificado?
class NamedInteger(int):
def __init__(self, value):
super(NamedInteger, self).__init__(value)
self.name = 'pony'
def __str__(self):
return self.name
x = NamedInteger(5)
print x + 3
print str(x)
Esto funciona bien en Python 2.4, pero Python 2.6 muestra una advertencia de desaprobación. ¿Cuál es la mejor forma de subclasificar un tipo numérico y redefinir los constructores para los tipos integrados en las versiones más nuevas de Python?
Editar: visto en los comentarios que esto funciona sin una línea super(), por lo que podría ser así:
class NamedInteger(int):
def __init__(self, value):
self.name = 'pony'
def __str__(self):
return self.name
x = NamedInteger(5)
print x + 3
print str(x)
creo que esto funciona porque int es tipo inmutable y sólo tiene __new__
método. Sin embargo, me alegra saber de una manera correcta de subclases, por lo que podría construir una clase con el comportamiento de la siguiente manera:
x = NamedInteger(5, 'kitty')
Segunda edición:
La versión final se verá así:
class NamedInteger(int):
def __new__(cls, value, name='pony'):
self = super(NamedInteger, cls).__new__(cls, value)
self.name = name
return self
def __str__(self):
return self.name
x = NamedInteger(5)
y = NamedInteger(3, 'kitty')
print "%d %d" % (x, y)
print "%s %s" % (x, y)
Las respuestas a continuación también dieron enlaces muy interesantes a los módulos Abstract Base Classes y numbers.
+1 Buena pregunta: consulte [este hilo en el rastreador de errores de Python] (http://bugs.python.org/issue1683368) para ver el historial de este cambio. – balpha