协慌网

登录 贡献 社区

如何在 Python 中从子类中调用父类的方法?

在 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 中的实际限制,我的理解上的空白还是两者都有?

答案

使用super()函数:

class Foo(Bar):
    def baz(self, arg):
        return super().baz(arg)

对于 Python <3,必须显式选择使用新型类并使用:

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)

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是要查找whateverAnyClass的祖先如果AnyClass没有定义 / 覆盖它,而这个‘呼吁父母的方法子类’作为任何其它情况适用于真!