¿Cómo extender una clase en Python?

92

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 getcolorfunció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

omega
fuente
2
¿Intentaste leer la documentación? docs.python.org/2.7/tutorial/classes.html#inheritance
wRAR
las clases deben tener la primera letra en mayúscula ("Color" no "color");)
daveoncode
14
@wRAR Tal vez en 2013 esta sea una pregunta razonable, pero seamos honestos: la gente recurre primero a StackOverflow, por lo que esta es una buena pregunta para SO. Esta pregunta es el primer acierto de Google para "Python extender clase", la documentación es la tercera.
TC Proctor

Respuestas:

94

Utilizar:

import color

class Color(color.Color):
    ...

Si esto fuera Python 2.x, usted también desea derivar color.Colorde object, para que sea una clase de nuevo estilo :

class Color(object):
    ...

Esto no es necesario en Python 3.x.

NPE
fuente
31
Vale la pena señalar que puede darle a la nueva clase el mismo nombre que la anterior: 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.)
Kindall
17
class extended_color(color):Normalmente son malos estándares - class ExtendedColor(Color):debería ser para las clases. Sólo un
detalle
Pregunta de novato aquí: ¿por qué no usaste __init__?
Mentalista
0

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:testDottedQuadbit:

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.

fyngyrz
fuente