我有以下代码:
class A(object):
def __init__(self):
self.name = "A"
super(A, self).__init__()
def Update(self):
print "Update A"
self.PickTarget()
def PickTarget(self):
print "PickTarget A"
class B(object):
def __init__(self):
self.name = "B"
super(B, self).__init__()
def Update(self):
print "Update B"
self.PickTarget()
def PickTarget(self):
print "PickTarget B"
class C(A, B):
def __init__(self):
super(C, self).__init__()
def Update(self, useA):
if useA:
A.Update(self)
else:
B.Update(self)
c = C()
c.Update(useA = True)
# prints:
# Update A
# PickTarget A
c.Update(useA = False)
# prints:
# Update B
# PickTarget A
Run Code Online (Sandbox Code Playgroud)
为什么打电话C.Update与useA=False还叫成A.PickTarget?我怎样才能使这项工作成为我希望它工作的方式(即B.Update总是调用B.PickTarget)?我确定之前已经问过这个问题,但我的搜索没有发现 - 可能是因为我不知道该搜索什么.
这是因为A之前B在C的基类.
你需要使用B.PickTarget(self)而不是self.PickTarget()in B.Update(self)来获得这种行为.否则,切换A到Bin C的定义.
编辑:
如果预期的行为是B总是调用方法B和A总是调用的方法A,它的正确使用A.method(self),而不是self.method()作为第二种形式并不意味着method是A.
你应该重新设计你的课程.A应该有一个移动方法,随机移动机器人并定义它的其他基本行为.B应该是一个子类,A并且应该有一个move方法,super(B, self).move()如果它没有路径则调用,否则在路径上移动.这是在条件上覆盖方法的正确方法.