多重继承并使用其中一个基类的方法

com*_*ave 6 python

我有以下代码:

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)?我确定之前已经问过这个问题,但我的搜索没有发现 - 可能是因为我不知道该搜索什么.

agf*_*agf 7

这是因为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()如果它没有路径则调用,否则在路径上移动.这是在条件上覆盖方法的正确方法.