2015-05-22 2 views
2

Предположит, у меня есть следующие структуры класса:Pythonic подхода к множественному методу Parent вызовов

class Mixin1(Base1): 
    def get_data(self): 
     # Gather some data in some way 


class Mixin2(Base2): 
    def get_data(self): 
     # Gather some data in another way 


class MyClass(Mixin1, Mixin2): 
    def get_data(self): 
     # Gather some data in yet another way. Then... 
     # Get Mixin2's version of get_data. Then... 
     # Get Mixin1's version of get_data. 

Пример случай, чтобы обеспечить некоторый контекст, что Mixin1 является обработчиком аутентификации и Mixin2 является обработчиком Войти. Функциональность родительских классов будет заполнять переменные экземпляра (скажем, сообщения об ошибках).

Какой был бы самый Pythonic подход к вызову методов родителя get_data?

Один подход, чтобы получить этот вид информации может быть что-то вроде этого:

original_class = self.__class__.__base__ 
parents = [base for base in original_class.__bases__] 
for parent in parents: 
    parent.get_data() 

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

Любые предложения? Можно ли использовать для этого super()?

+4

'super()' именно то, что вы должны использовать, так как оно предназначено для решения именно этой проблемы. – kindall

+2

Вы должны прочитать [Super рассмотренный супер] (https://rhettinger.wordpress.com/2011/05/26/super-considered-super/), который объясняет, как использовать супер в сценарии множественного наследования. –

+1

@kindall Как вы обрабатываете случай выбора метода родителя для вызова с помощью 'super()'? Что, если вы хотите назвать их в определенном порядке? – cpburnz

ответ

4
class MyClass(Mixin1, Mixin2): 
    def get_data(self): 
     # do local stuff 
     data2 = Mixin2.get_data(self) 
     data1 = Mixin1.get_data(self) 

Также, this post, похоже, связано.

Другой подход заключается в использовании сдерживания вместо наследования.

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

  • Нет связанных вопросов^_^