En Python, ¿cómo se puede extender una clase? Por ejemplo si tengo
color.py
class Color:
def __init__(self, color):
self.color = color
def getcolor(self):
return self.color
color_extended.py
import Color
class Color:
def getcolor(self):
return self.color + " extended!"
Pero esto no funciona ... Espero que si trabajo en color_extended.py
, cuando haga un objeto de color y use la getcolor
función, devolverá el objeto con la cadena "¡extendido!" en el final. También debería haber obtenido el init de la importación.
Suponga python 3.1
Gracias
Respuestas:
Utilizar:
import color class Color(color.Color): ...
Si esto fuera Python 2.x, usted también desea derivar
color.Color
deobject
, para que sea una clase de nuevo estilo :class Color(object): ...
Esto no es necesario en Python 3.x.
fuente
class color(color):
define una nueva clase que reemplaza a la anterior, pero que se deriva de ella. (Esto parece ser lo que el PO está tratando de hacer.)class extended_color(color):
Normalmente son malos estándares -class ExtendedColor(Color):
debería ser para las clases. Sólo un__init__
?Otra forma de extender (específicamente, agregar nuevos métodos, no cambiar los existentes) clases, incluso las integradas, es usar un preprocesador que agrega la capacidad de extender fuera o por encima del alcance de Python, convirtiendo la extensión a sintaxis normal de Python antes de que Python realmente lo vea.
Hice esto para extender la
str()
clase de Python 2 , por ejemplo.str()
es un objetivo particularmente interesante debido al vínculo implícito con datos citados como'this'
y'that'
.Aquí hay un código de extensión, donde la única sintaxis que no es de Python agregada es el
extend:testDottedQuad
bit:extend:testDottedQuad def testDottedQuad(strObject): if not isinstance(strObject, basestring): return False listStrings = strObject.split('.') if len(listStrings) != 4: return False for strNum in listStrings: try: val = int(strNum) except: return False if val < 0: return False if val > 255: return False return True
Después de lo cual puedo escribir en el código enviado al preprocesador:
if '192.168.1.100'.testDottedQuad(): doSomething() dq = '216.126.621.5' if not dq.testDottedQuad(): throwWarning(); dqt = ''.join(['127','.','0','.','0','.','1']).testDottedQuad() if dqt: print 'well, that was fun'
El preprocesador se come eso, escupe Python normal sin parchear, y Python hace lo que yo pretendía que hiciera.
Así como el preprocesador de CA agrega funcionalidad ac, también un preprocesador de Python puede agregar funcionalidad a Python.
La implementación de mi preprocesador es demasiado grande para una respuesta de desbordamiento de pila, pero para aquellos que puedan estar interesados, está aquí en GitHub.
fuente