通过 Mixin 调用 Grandparent Method 而不执行父方法
Call Grandparent Method without executing parent method through Mixin
我需要覆盖Parent 方法并通过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
方法并将其称为 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
函数。
我需要覆盖Parent 方法并通过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
方法并将其称为 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
函数。