Python方法覆盖规则

时间:2013-03-06 09:19:35

标签: python override

class a:
    def set(self, value):
        print value+1

    def set2(self, value):
        self.set(value)

class b(a):        
    def set(self, value):
        print value

if __name__ == '__main__':
    i = b()
    i.set2(10)

执行时,我得到结果为10,这意味着b.set()被调用,但为什么不a.set(),因为它是用explict self调用的?

P.S。 那么,即使类'a'没有方法set(),这段代码仍然有用吗?但这是一个很好的编码规则吗?

3 个答案:

答案 0 :(得分:3)

你在派生类中覆盖set(),这就是self.set()调用的内容。

要调用a的方法,您可以使用以下语法:

    a.set(self, value)

答案 1 :(得分:2)

当您致电self.set(value)时,无论您在何处呼叫,它始终会为set()提供相同的定义。

class Animal(object):
    def interact(self):
        print('I am a {}, I say "{}"'.format(self.name(), self.speak()))

class Dog(Animal):
    def name(self):
        return 'dog'
    def speak(self):
        return 'woof'

如果您愿意,可以明确致电a.set()

class A(object):
    def set(self, value):
        print(value + 1)
    def set2(self, value):
        A.set(self, value)
然而,这有点傻。这个例子非常抽象,你不能用它来找出好的编码风格。

答案 2 :(得分:0)

在您的情况下,如果您想要调用a的{​​{1}},则需要使用以下语法。 set()