2016-09-05 10 views
2

親メソッドをオーバーライドし、grandparentメソッドをmixinで呼び出す必要があります。出来ますか?親メソッドをMixinで実行しないでGrandparentメソッドを呼び出す

たとえば、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 ... 

今私はBからclass_nameメソッドをオーバーライドして、それはスーパーだ呼び出す必要があります。私はD().class_name()を呼び出したときに

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 

今、それだけで"Mixin" and "A"を印刷する必要があります。

+0

おそらく 'mro'(メソッドの解決順序)を使って行うことができますが、' class D(B、Mixin) 'を書いた場合には壊れると思います。 – RedX

+0

ソリューション:http://pastebin.com/k57Bipk2 – nKandel

答えて

1

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という関数で実行することができます。

関連する問題