¿Cómo extender una clase en python?

4 minutos de lectura

avatar de usuario
omega

En python, ¿cómo puedes 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_extendido.py

import Color

class Color:
    def getcolor(self):
        return self.color + " extended!"

Pero esto no funciona… Espero que si trabajo en color_extended.pyluego, cuando hago un objeto de color y uso el getcolor entonces devolverá el objeto con la cadena “extendida!” en el final. También debería haber obtenido el inicio de la importación.

Supongamos Python 3.1

  • ¿Intentaste leer la documentación? docs.python.org/2.7/tutorial/classes.html#herencia

    – wRAR

    20 de marzo de 2013 a las 14:53

  • las clases deben tener la primera letra en mayúscula (“Color” no “color”) 😉

    – daveoncode

    20 de marzo de 2013 a las 14:53


  • @wRAR Tal vez en 2013 esta sea una pregunta razonable, pero seamos honestos: la gente recurre primero a StackOverflow, por lo que es una buena pregunta para SO. Esta pregunta es el primer éxito de Google para “python extend class”, la documentación es la tercera.

    – Supervisor de TC

    7 julio 2017 a las 19:02

avatar de usuario
NPE

Usar:

import color

class Color(color.Color):
    ...

Si esto fuera Python 2.x, también querrías derivar color.Color de objectpara que sea una clase de nuevo estilo:

class Color(object):
    ...

Esto no es necesario en Python 3.x.

  • Vale la pena señalar que puede dar 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 OP está tratando de hacer).

    – tipo todo

    20 de marzo de 2013 a las 15:05


  • class extended_color(color): son malos estándares por lo general – class ExtendedColor(Color): debería ser para las clases. solo un detalle

    – TiranoWave

    20 de marzo de 2013 a las 15:07

  • Pregunta novata aquí: ¿por qué no usaste __init__?

    – Mentalista

    29 de octubre de 2020 a las 7:34

  • @Mentalist: dado que el enfoque se basa en una nueva clase personalizada llamada Color sobre lo existente Color clase en el color módulo, solo necesita implementar definiciones de sobrecarga. Por ejemplo, si no implementa un __init__() método en su nueva clase, pero hay uno en la clase en la que está basando el suyo, solo usará la clase base __init__() método.

    – scrthq

    08/01/2021 a las 20:10

class MyParent:

    def sayHi():
        print('Mamma says hi')
from path.to.MyParent import MyParent

class ChildClass(MyParent):
    pass

una instancia de ChildClass entonces heredará el sayHi() método.

Otra forma de extender (específicamente lo que significa agregar nuevos métodos, no cambiar los existentes) clases, incluso las integradas, es usar un preprocesador que agregue la capacidad de extenderse fuera o por encima del alcance de Python, convirtiendo la extensión en sintaxis normal de Python antes de que Python pueda verla.

He hecho esto para extender Python 2 str() clase, por ejemplo. str() es un objetivo particularmente interesante debido al vínculo implícito con los datos citados, como 'this' y 'that'.

Aquí hay un código de extensión, donde la única sintaxis añadida que no es de Python es la extend:testDottedQuad un poco:

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 alimentado 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 parches de mono, y Python hace lo que pretendía que hiciera.

Así como el preprocesador ac agrega funcionalidad a c, 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, es aquí en GitHub.

  • Esto es muy genial. Use esto en Swift todo el tiempo, desearía que Python lo hiciera de forma nativa, aunque sospecho que hay demasiado equipaje de cadena de herramientas. Además, una respuesta real a la pregunta formulada.

    – Enero Z

    22 de noviembre de 2021 a las 0:22


avatar de usuario
Red de abedul

Lo uso así.

class menssagem:
  propriedade1 = "Certo!"
  propriedade2 = "Erro!"

def metodo1(self)
  print(self.propriedade1)

extender.

import menssagem
class menssagem2(menssagem):

  menssagem1 = None #não nescessario not necessary

  def __init__(self,menssagem):
    self.menssagem1 = menssagem

  #call first class method
  #usando o metodo da menssagem 1

  def Menssagem(self):
    self.menssagem1.metodo1()

¿Ha sido útil esta solución?