在 Python 中创建简单的对象层次结构时,我希望能够从派生类中调用父类的方法。在 Perl 和 Java 中,有一个用于此的关键字( super
)。在 Perl 中,我可以这样做:
package Foo;
sub frotz {
return "Bamf";
}
package Bar;
@ISA = qw(Foo);
sub frotz {
my $str = SUPER::frotz();
return uc($str);
}
在 Python 中,似乎必须从子类中明确命名父类。在上面的示例中,我必须执行类似Foo::frotz()
。
这似乎不正确,因为这种行为使创建深层次结构变得困难。如果孩子们需要知道哪个类定义了一个继承的方法,那么就会造成各种各样的信息痛苦。
这是 python 中的实际限制,我的理解上的空白还是两者都有?
Python 也具有超级功能:
<strong>super</strong> (type[, object-or-type])
返回将方法调用委托给类型的父级或同级类的代理对象。这对于访问已在类中重写的继承方法很有用。搜索顺序与 getattr()所使用的顺序相同,只是类型本身被跳过。
例子:
class A(object): # deriving from 'object' declares A as a 'new-style-class'
def foo(self):
print "foo"
class B(A):
def foo(self):
super(B, self).foo() # calls 'A.foo()'
myB = B()
myB.foo()
ImmediateParentClass.frotz(self)
无论直接父类是frotz
本身定义还是继承它,都将很好。只有为正确支持多重super
(然后,只有在每个类都正确使用它的情况下,super 才起作用)。在一般情况下, AnyClass.whatever
是要查找whatever
在AnyClass
的祖先如果AnyClass
没有定义 / 覆盖它,而这个‘呼吁父母的方法子类’作为任何其它情况适用于真!