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


当前回答

在python中也有一个super()。

如何从子类方法调用父类方法的示例

class Dog(object):
    name = ''
    moves = []

    def __init__(self, name):
        self.name = name

    def moves_setup(self,x):
        self.moves.append('walk')
        self.moves.append('run')
        self.moves.append(x)
    def get_moves(self):
        return self.moves

class Superdog(Dog):

    #Let's try to append new fly ability to our Superdog
    def moves_setup(self):
        #Set default moves by calling method of parent class
        super().moves_setup("hello world")
        self.moves.append('fly')
dog = Superdog('Freddy')
print (dog.name)
dog.moves_setup()
print (dog.get_moves()) 

这个例子类似于上面解释的例子。但是有一个区别,super没有传递任何参数给它。以上代码在python 3.4版本中可执行。

其他回答

很多答案都解释了如何从父进程调用已经在子进程中被重写的方法。

然而

“如何从子类调用父类的方法?”

也可以表示:

"如何调用继承方法?"

你可以调用从父类继承的方法,就像它们是子类的方法一样,只要它们没有被覆盖。

例如,在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 有助于理解如何访问继承的方法。

下面是一个使用super()的例子:

#New-style classes inherit from object, or from another new-style class
class Dog(object):

    name = ''
    moves = []

    def __init__(self, name):
        self.name = name

    def moves_setup(self):
        self.moves.append('walk')
        self.moves.append('run')

    def get_moves(self):
        return self.moves

class Superdog(Dog):

    #Let's try to append new fly ability to our Superdog
    def moves_setup(self):
        #Set default moves by calling method of parent class
        super(Superdog, self).moves_setup()
        self.moves.append('fly')

dog = Superdog('Freddy')
print dog.name # Freddy
dog.moves_setup()
print dog.get_moves() # ['walk', 'run', 'fly']. 
#As you can see our Superdog has all moves defined in the base Dog class

我建议使用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()

使用super()函数:

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

对于Python < 3,必须显式选择使用new-style类并使用:

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)
class department:
    campus_name="attock"
    def printer(self):
        print(self.campus_name)

class CS_dept(department):
    def overr_CS(self):
        department.printer(self)
        print("i am child class1")

c=CS_dept()
c.overr_CS()