2016-09-05 2 views
2

Мне нужно переопределить родительский метод и вызвать метод бабушки дедушки через mixin. Является ли это возможным?Вызовите метод бабушки и дедушки без выполнения родительского метода с помощью Mixin

Например: A и B являются библиотечными классами.

class A(object): 
    def class_name(self): 
     print "A" 


class B(A): 
    def class_name(self): 
     print "B" 
     super(B, self).class_name() 
    # other methods ... 

Теперь мне нужно переопределить метод class_name из B и называют это супер.

class Mixin(object): 
    def class_name(self): 
     print "Mixin" 
     # need to call Grandparent class_name instead of parent's 
     # super(Mixin, self).class_name() 


class D(Mixin, B): 
    # Here I need to override class_name method from B and call B's super i.e. A's class_name, 
    # It is better if I can able to do this thourgh Mixin class. (
    pass 

Теперь, когда я назвал D().class_name(), он должен печатать только "Mixin" and "A". Не «B»

+0

Возможно, это можно сделать с помощью 'mro' (порядок разрешения метода), но я думаю, что он сломается, если вы написали' class D (B, Mixin) '. – RedX

+0

Решение: http://pastebin.com/k57Bipk2 – nKandel

ответ

1

Один из способов - использовать inspect.getmro(), но это может сломаться, если пользователь пишет class D(B, Mixin).

Позвольте мне продемонстрировать:

class A(object): 
    def class_name(self): 
     print "A" 


class B(A): 
    def class_name(self): 
     print "B" 
     super(B, self).class_name() 
    # other methods ... 

class Mixin(object): 
    def class_name(self): 
     print "Mixin" 
     # need to call Grandparent class_name instead of parent's 
     # super(Mixin, self).class_name() 


class D(Mixin, B): 
    # Here I need to override class_name method from B and call B's super i.e. A's class_name, 
    # It is better if I can able to do this thourgh Mixin class. (
    pass 

class E(B, Mixin): pass 


import inspect 
print inspect.getmro(D) # returns tuple with (D, Mixin, B, A, object) 
print inspect.getmro(E) # returns tuple with (E, B, A, Mixin, object) 

Так что если у вас есть контроль и может гарантировать, что вы всегда получите Mixin первым. Вы можете использовать getmro(), чтобы получить дедушку и бабушку и выполнить ее функцию class_name.

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