如何让子类在python中扩展超类的方法

时间:2016-07-09 05:43:04

标签: python-2.7 oop

我编码游戏的动态。游戏中有两种障碍,块和球,可以推动。我想让球在推动时开始滚动。

所以我写了下面的代码:

class Barrier:
    def __move(self):
        print 'Moving'

    def push(self):
        if self.canMove():
            self.__move()
        else:
            pass # Push barriers in front of it

    def canMove(self):
        return True

class Ball(Barrier):
    def __move(self):
        self.__startRolling()
        super(Ball, self).__move()

    def __startRolling(self):
        print 'Started rolling'

class Block(Barrier):
    # bla bla bla
    pass

调用push()时,类Barrier将检查它是否可以移动(前面的其他障碍可以阻止它移动),然后调用self.__move()。对于类Ball,它会覆盖此方法并在移动之前开始滚动。

有两个问题。首先,当我运行以下代码时:

ball = Ball()
ball.push()

我刚在屏幕上显示Moving,但没有Started rolling

第二,当我跑:

ball = Ball()
ball._Ball__move()

我得到了:

Traceback (most recent call last):
  File "F:\project\test.py", line 25, in <module>
    ball._Ball__move()
  File "F:\project\test.py", line 15, in __move
    super(Ball, self).__move()
TypeError: must be type, not classobj

如何实现我的目标?

1 个答案:

答案 0 :(得分:1)

您遇到的问题是由__move()中的两个前导下划线引起的。这会导致名称错位。

在第一种情况下,您的通话将发送至Barrier.__move()而不是Ball.__move(),因为在Ball类Ball.__move()之外只有_Ball__move()可用,但显然未从Barrier.push()调用{1}}。

在第二种情况下,我得到了:

AttributeError: 'super' object has no attribute '_Ball__move'

这又是由于名称错误造成的。 super()不会有_Ball__move()属性。

要实现目标,您可以删除两个前导下划线。

PEP-8:为避免与子类发生名称冲突,请使用两个前导下划线来调用Python的名称修改规则。