同名方法与继承,Python

4 投票
1 回答
11023 浏览
提问于 2025-04-16 23:14

我有个奇怪的问题,由于背景比较复杂,我做了个简单的例子。我有两个类,分别叫BaseChild。这两个类都有一个同名的方法go。我希望Child类能够继承Base类的go方法。不过,当我在Child上调用go方法时,我希望它能先做一些事情(在这个例子中,就是把属性A乘以2),然后再调用它从Base继承来的go方法。

在这个例子中,调用Basego方法会打印出35,而我希望Child打印出70。

class Base :
    def __init__ (self) :
        self.A = 35

    def go (self) :
        print self.A


class Child (Base) :
    def __init__ (self) :
        Base.__init__(self)

    def go (self) :
        self.A = self.A * 2

        # Somehow call Base's **go** method, which would print 70.

我知道这样做通常不是个好主意(因为可能会让人困惑),不过在我现在做的事情中,这样做是有道理的。

1 个回答

13

这样做完全没问题。你需要的就是 super()

class Child (Base):
    def __init__ (self):
        super(Child, self).__init__()

    def go(self):
        self.A = self.A * 2
        super(Child, self).go()

在Python 3中,你可以直接使用它而不需要传入参数,因为它会自动识别正确的参数。

补充一下:super() 是用于新式类的,你应该使用这种方式。只要把任何不继承其他类的类声明为继承自 object 就可以了:

class Base(object):

另外,括号前后多余的空格在Python中并不是好的风格,具体可以参考 PEP8

撰写回答