在Python中从子类调用父类的方法?
在Python中创建简单对象层次结构时,我希望能够从派生类中调用父类的方法。 在Perl和Java中,这个(超级)有一个关键字。 在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中的一个实际限制,是我理解还是两者的缺陷?
是的,但只适用于新式课程。 使用super()
函数:
class Foo(Bar):
def baz(self, arg):
return super(Foo, self).baz(arg)
Python也具有超级特性:
super (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
只是为了适当支持多重继承(然后它只适用于每个班级正确使用它的情况)。 在一般情况下, AnyClass.whatever
是要查找whatever
在AnyClass
的祖先如果AnyClass
没有定义/覆盖它,而这个‘呼吁父母的方法子类’作为任何其它情况适用于真!
上一篇: Call a parent class's method from child class in Python?