我编码游戏的动态。游戏中有两种障碍,块和球,可以推动。我想让球在推动时开始滚动。
所以我写了下面的代码:
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
如何实现我的目标?
答案 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的名称修改规则。