Как вызвать исходный метод, когда он исправлен?

У меня есть класс в основном проекте, который я не хочу менять.

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
10
задан rds 4 January 2012 в 14:24
поделиться