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.py
luego, 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
NPE
Usar:
import color
class Color(color.Color):
...
Si esto fuera Python 2.x, también querrías derivar color.Color
de object
para 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 existenteColor
clase en elcolor
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
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()
¿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