Tengo una clase en el proyecto principal que no quiero cambiar.¿Cómo llamar al método original cuando está parchado?
class A():
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def name(self):
# this method could be much more complex
return self.lastname.upper()
Estoy intentando construir un plugin mechansim. Hasta aquí todo bien, tengo un punto de extensión de esta manera:
if __name__ == '__main__':
''' The main project has an extension point that allows me to do'''
# for each class extension such as AExtended:
A.name = AExtended.name
''' After the extensions are loaded, some behaviours may be changed'''
a = A("John", "Doe")
print(a.name())
Un plugin se puede escribir así:
class AExtended(A):
''' This is an extension I provide through a plugin mechanism
'''
def name(self):
return self.firstname + ' ' + self.lastname.upper()
Todo esto funciona muy bien. Ahora obtengo "John DOE".
Mi problema es que el método original name()
puede ser bastante complejo. En otras palabras, no puedo darme el lujo de llamar al self.lastname.upper()
en el AExtended
. Me gustaría llamar al método "super", que ya no existe, porque ha sido sobrescrito.
¿Cómo puedo cambiar mi código, a fin de lograr algo como esto:
class AExtended(A):
def name(self):
# I'm looking for a way to call the base implementation that was in A.name()
return self.firstname + ' ' + parent.name()
Gracias por su ayuda!
Editar: Algunas explicaciones de lo que intento hacer.
- Quiero que el complemento parchee el comportamiento de
A
. No me puedo permitir a los consumidores cambiar existentes de un - Hay muchas clases como
A
que se podrían cambiar, me gustaría plugins para tener un control total y la responsabilidad - Es cierto
AExtended
no tiene que heredar deA
, pero fue una manera fácil de acceder alself.firstname
. No tengo problemas para seguir un patrón de diseño diferente si puede ayudar.
tengo una solución, pero no es muy elegante y difícil generalizar
class AExtended(A):
def name(self):
# I'm looking for a way to call the base implementation that was in A.name()
return self.firstname + ' ' + self.parentname()
#in main
A.parentname = A.name
A.name = AExtended.name
Sí, leí cómo [llamar al método de la clase padre] (http://stackoverflow.com/questions/805066/how-to-call-a-parent-classs-method-from- child-class-in-python) pero en 'AExtended.name',' self' es un 'A' debido a la anulación – rds
Podría ser más linco con [anulando un método privado] (http://stackoverflow.com/ preguntas/2484215/how-do-i-override-a-parent-classs-functions-in-python) pero no puedo cambiar el nombre del método A. – rds
Dadas sus aclaraciones, le sugiero que cambie el título de la pregunta. Un título más preciso podría ser "¿Cómo llamar al método original cuando está parchado?" – Weeble