在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的实际限制,还是我理解上的差距,或者两者兼而有之?
我建议使用CLASS.__bases__
就像这样
class A:
def __init__(self):
print "I am Class %s"%self.__class__.__name__
for parentClass in self.__class__.__bases__:
print " I am inherited from:",parentClass.__name__
#parentClass.foo(self) <- call parents function with self as first param
class B(A):pass
class C(B):pass
a,b,c = A(),B(),C()
如果你不知道你可能会得到多少争论,并且想把它们都传递给孩子:
class Foo(bar)
def baz(self, arg, *args, **kwargs):
# ... Do your thing
return super(Foo, self).baz(arg, *args, **kwargs)
(来自:Python -覆盖__init__的最干净的方法,其中可选的kwarg必须在super()调用后使用?)
很多答案都解释了如何从父进程调用已经在子进程中被重写的方法。
然而
“如何从子类调用父类的方法?”
也可以表示:
"如何调用继承方法?"
你可以调用从父类继承的方法,就像它们是子类的方法一样,只要它们没有被覆盖。
例如,在python 3中:
class A():
def bar(self, string):
print("Hi, I'm bar, inherited from A"+string)
class B(A):
def baz(self):
self.bar(" - called by baz in B")
B().baz() # prints out "Hi, I'm bar, inherited from A - called by baz in B"
是的,这可能是相当明显的,但我觉得如果不指出这一点,人们可能会留下这样的印象:你必须跳过荒谬的圆环,只是为了访问python中的继承方法。特别是当这个问题在“如何在Python中访问父类的方法”的搜索中占很高的比例时,这个OP是从Python新手的角度编写的。
我发现:
https://docs.python.org/3/tutorial/classes.html#inheritance
有助于理解如何访问继承的方法。