2016-03-15 2 views
1

(Python 3)питона множественное наследование вызова переопределены функциям в супер контексте

Я пытаюсь расширить класс с некоторой фантазией новых процедур форматирования, однако я хотел бы также, чтобы иметь возможность использовать процедуры форматирования в базовый класс.

class Plaintext(object): 
    def print_thing(self, thing): 
     print("plain", thing) 

    def print_blob(self, blob): 
     for thing in blob: 
      self.print_thing(thing) 

    def print_goober(self, blob): 
     print("plaintext") 
     self.print_blob(blob) 

class Markdown(Plaintext): 
    def print_thing(self, thing): 
     print("mark", thing) 

    def print_goober(self, blob): 
     print("markdown") 
     self.print_blob(blob) 
     super().print_blob(blob) 

newclass = Markdown() 
newclass.print_goober([1,2,3]) 

При запуске, я получаю:

markdown 
mark 1 
mark 2 
mark 3 
mark 1 
mark 2 
mark 3 

Как я могу получить newclass.print_goober() для вызова print_blob() первый в своей самостоятельной контексте, а затем в контексте BaseClass?

Выход я пытался получить был:

markdown 
mark 1 
mark 2 
mark 3 
plain 1 
plain 2 
plain 3 

Мне нужно создать какой-то подмешать вещи делать?

+0

Вашего 'print_thing()' метод быть переопределен в подклассе. Вот почему он печатает весь синтаксис 'mark' –

+0

для вызова супер. Это должно быть '' 'super (Markdown, self) .print_blob (blob)' '' – navyad

+0

@naveenyadav - В python3.x не была введена комбинация 'super()' shortcut. – mgilson

ответ

1

So ... self хорошо ... self. В вашем примере каждый раз, когда вы звоните self, он является экземпляром Markdown, который известен снаружи как newclass.

Когда вы думаете об этом таким образом, self.print_thing делает то, что вы ожидаете от него. Он ищет первый метод print_thing, который он может найти, а затем называет его self в качестве первого аргумента.

Хорошо, теперь у нас это отсортировано ... Как мы делаем то, что вы хотите сделать? Ну, (и я не могу сказать это достаточно сильно) нет clean способ сделать это, не будучи более явным о том, что вы на самом деле хотите. В этом случае, я рекомендую иметь markdown определить новые методы, которые вызывают старые:

class Plaintext(object): 
    def print_thing(self, thing): 
     print("plain", thing) 

    def print_blob(self, blob): 
     for thing in blob: 
      self.print_thing(thing) 

    def print_goober(self, blob): 
     print("plaintext") 
     self.print_blob(blob) 

class Markdown(Plaintext): 
    def print_markdown_thing(self, thing): 
     print("mark", thing) 

    def print_markdown_blob(self, blob): 
     for thing in blob: 
      self.print_markdown_thing(thing) 

    def print_goober(self, blob): 
     print("markdown") 
     self.print_markdown_blob(blob) 
     self.print_blob(blob) 

newclass = Markdown() 
newclass.print_goober([1,2,3]) 
+0

К сожалению, я стараюсь избегать этого, поскольку print_blob() является сложной процедурой и будет включать репликацию кода. –

Смежные вопросы