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


当前回答

ImmediateParentClass.frotz(self)

无论直接父类本身定义了frotz还是继承了它,都会很好。Super只在适当支持多重继承时才需要(并且只有当每个类都正确使用它时,它才会工作)。一般来说,AnyClass。如果AnyClass没有定义/覆盖它,whatever将在AnyClass的祖先中查找whatever,这对于“子类调用父方法”和任何其他情况都是正确的!

其他回答

ImmediateParentClass.frotz(self)

无论直接父类本身定义了frotz还是继承了它,都会很好。Super只在适当支持多重继承时才需要(并且只有当每个类都正确使用它时,它才会工作)。一般来说,AnyClass。如果AnyClass没有定义/覆盖它,whatever将在AnyClass的祖先中查找whatever,这对于“子类调用父方法”和任何其他情况都是正确的!

Python中也有一个super()。它有点不稳定,因为Python有新旧风格的类,但它非常常用,例如在构造函数中:

class Foo(Bar):
    def __init__(self):
        super(Foo, self).__init__()
        self.baz = 5
class a(object):
    def my_hello(self):
        print "hello ravi"

class b(a):
    def my_hello(self):
    super(b,self).my_hello()
    print "hi"

obj = b()
obj.my_hello()

Python 3有一个不同的更简单的语法来调用父方法。

如果Foo类继承自Bar,则继承自Bar。__init__可以通过super()从Foo调用。__init__():

class Foo(Bar):

    def __init__(self, *args, **kwargs):
        # invoke Bar.__init__
        super().__init__(*args, **kwargs)

如果你不知道你可能会得到多少争论,并且想把它们都传递给孩子:

class Foo(bar)
    def baz(self, arg, *args, **kwargs):
        # ... Do your thing
        return super(Foo, self).baz(arg, *args, **kwargs)

(来自:Python -覆盖__init__的最干净的方法,其中可选的kwarg必须在super()调用后使用?)