通过 Mixin 调用 Grandparent Method 而不执行父方法

Call Grandparent Method without executing parent method through Mixin

我需要覆盖Parent 方法并通过mixin 调用Grandparent 方法。可能吗?

例如:AB是图书馆类。

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 ...

现在我需要重写 Bclass_name 方法并将其称为 super。

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"

一种方法是使用 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 函数。