在 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 中的实际限制,我理解上的差距还是两者兼而有之?

原文由 jjohn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 348
2 个回答

使用 super() 功能:

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

对于 Python < 3,您必须明确选择使用 新式类 并使用:

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

原文由 Adam Rosenfield 发布,翻译遵循 CC BY-SA 4.0 许可协议

Python 也有 super

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()

原文由 Jay 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题