У меня есть класс в основном проекте, который я не хочу менять.
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()
Я пытаюсь создать механизм плагина. Пока все хорошо, у меня есть точка расширения вроде этого:
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()
Спасибо за вашу помощь!
Edit: Некоторые объяснения того, что я пытаюсь сделать.
A
. Я могу ' t позволяют изменять существующих потребителей A A
tha t может быть изменен, я бы хотел, чтобы плагины имели полный контроль и ответственность 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