У меня есть класс в основном проекте, который я не хочу менять.Как вызвать исходный метод, когда он очищен от обезьяны?
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()
Я пытаюсь создать плагин mechansim. До сих пор так хорошо, у меня есть точка расширения, как это:
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())
плагин можно записать так:
class AExtended(A):
''' This is an extension I provide through a plugin mechanism
'''
def name(self):
return self.firstname + ' ' + self.lastname.upper()
Это все работает очень хорошо. Теперь я получаю «John DOE».
Моя проблема заключается в том, что метод оригинала name()
может быть довольно сложным. Другими словами, я не могу позволить позвонить по телефону self.lastname.upper()
в AExtended
. Я бы назвал метод «супер», который больше не существует, потому что он был перезаписан.
Как я могу изменить свой код для того, чтобы добиться чего-то вроде этого:
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()
Спасибо за вашу помощь!
Редактировать: Некоторые объяснения того, что я пытаюсь сделать.
- Я хочу, чтобы плагин исправлял поведение
A
. Я не могу позволить себе, чтобы изменить существующие потребитель - Есть много классов, как
A
, которые могут быть изменены, я хотел бы плагин, чтобы иметь полный контроль и ответственность - Это правда
AExtended
не должна наследовать отA
, но это был простой способ получить доступ кself.firstname
. У меня нет проблем, следуя другому шаблону дизайна, если он может помочь.
У меня есть обходной путь, но это не очень элегантный и трудно обобщать
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
Да, я прочитал, как [вызвать метод родительского класса] (http://stackoverflow.com/questions/805066/how-to-call-a-parent-classs-method-from- child-class-in-python), но в 'AExtended.name',' self' является 'A' из-за переопределения – rds
Я мог бы быть более lcuky с [переопределением частного метода] (http://stackoverflow.com/ questions/2484215/how-do-i-override-a-parent-classes-functions-in-python), но я не могу изменить имя метода A. – rds
Учитывая ваши разъяснения, я предлагаю вам изменить заголовок вопроса. Более точным заголовком может быть «Как вызвать исходный метод, когда он пропатчен обезьяной»? – Weeble