Python中的多重继承问题!

Python中的多重继承问题!,python,multiple-inheritance,Python,Multiple Inheritance,为什么c.打印a()输出“B”? class A(object): def __init__(self): self.some_name = 'A' def print_a(self): print self.some_name class B(object): def __init__(self): self.some_name = 'B' def print_b(self): print s

为什么c.打印a()输出“B”?

class A(object):
    def __init__(self):
        self.some_name = 'A'

    def print_a(self):
        print self.some_name

class B(object):
    def __init__(self):
        self.some_name = 'B'

    def print_b(self):
        print self.some_name

class C(A, B):
    def __init__(self):
        A.__init__(self)
        B.__init__(self)

if __name__ == '__main__':
    c = C()
    c.print_a()


只有一个
self
,您正在
B中覆盖它的
某些名称。也许你已经习惯了C++,这里有两个独立的字段,<代码> A.So.No.No/<代码>和<代码> B.这个概念不适用于Python,在Python中,属性是在赋值时动态创建的。

这里只有一个对象;
some\u name
属性在所有继承类的方法之间共享。您可以调用
A.\uuuu init\uuuuu
,将其设置为
A
,然后调用
B.\uuu init\uuuuu
,将其更改为
B

还请注意,您错误地调用了基本方法;使用
super

class A(object):
    def __init__(self):
        self.some_name = 'A'
        super(A, self).__init__()

    def print_a(self):
        print self.some_name

class B(object):
    def __init__(self):
        self.some_name = 'B'
        super(B, self).__init__()

    def print_b(self):
        print self.some_name

class C(A, B):
    def __init__(self):
        super(C, self).__init__()

if __name__ == '__main__':
    c = C()
    c.print_a()

假设您想让C为一些类型A和B的对象设置名称,然后在类型C的对象上调用一些print_A和print_B方法来取回这些名称

可以使用C++继承模型获得这种行为,但是Python模型非常不同。只有一个对象具有一组字段。如果你想要C++行为,最简单的方法可能是声明子对象(它看起来像是对继承的一种常见滥用,而不是组成)。 看起来您正在尝试执行以下操作:

class Printable(object):
    def __init__(self, name):
        self.name = name

    def myprint(self):
        print self.name

class C(object):
    def __init__(self):
        self.a = Printable('A')
        self.b = Printable('B')

    def print_a(self):
        self.a.myprint()

    def print_b(self):
        self.a.myprint()

if __name__ == '__main__':
    c = C()
    c.print_a()

谢谢你的编辑!让我们试着澄清一下:您想让C为一些类型A和B的对象设置名称,然后调用一些print_A和print_B函数来取回这些名称?是的!为什么我不能像上面那样格式化代码呢?你必须在每行前面放4个前导空格,这样格式化程序才能理解它的代码。在所选块上也有一个图标可以执行此操作。我使用“{}”图标格式化代码,但失败了,有什么问题吗?在上面的第二种情况下,我应该怎么做,当超级类初始化时,我希望传入参数具有相同的键?我不确定你在问什么,但同一对象上不能有同名的不同属性。它们是同一个对象,存储在同一个位置:
c.\uu dict\uuu
,这只是一个普通的Python字典。请注意,您可以说
self.\uu一些\u名称
,这将为该类创建一个半“私有”属性;它实际上会创建名为
\u A\u some\u name
\u B\u some\u name
的属性。但这很少使用,我不推荐。@zkz:有什么问题吗?这是预期的Python行为。@ ZKZ,您需要为每个属性选择唯一的名称,并防止类彼此交错。上面的例子只是我的问题的抽象。在我的情况下,这更复杂,我不能从您的方式满足我的需要。我需要一种方式,如C++。因为你说的不太可能。所有的C++类继承模型都可以使用组合来管理。如果您的问题是从子对象中查找方法名,那么使用python自省工具(getattr)很容易做到。或者是一些公共基类的问题?实际上,继承从来都不是强制性的,只是一种将概念映射到代码的工具,在很多情况下,我看到它被用来做一些绝对不应该使用继承来完成的事情。
class Printable(object):
    def __init__(self, name):
        self.name = name

    def myprint(self):
        print self.name

class C(object):
    def __init__(self):
        self.a = Printable('A')
        self.b = Printable('B')

    def print_a(self):
        self.a.myprint()

    def print_b(self):
        self.a.myprint()

if __name__ == '__main__':
    c = C()
    c.print_a()