Python的多继承

Python的多继承

类A含有一个私有变量data,类B也含有一个私有变量data,它们名称恰好相同,但是在不同的类中有不同的作用,类C继承与A和B,如何才能做到让A和B各自拥有一份自己的data?

[Copy to clipboard] [ - ]
CODE:
class A:
    def __init__(self):
        self.data = "A"

class B:
    def __init__(self):
        self.data = "B"

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

c = C()
print c.data
输出结果:B,好像data是共享的?

对于上面的代码,我的问题是:
1、实例变量c包含有几份data,A.__init__中引用的data和B.__init__中引用的data是相同的吗?
2、如果是相同的,如何才能让它们各人引用各自的,达到如下C++代码的效果

[Copy to clipboard] [ - ]
CODE:
#include <stdio.h>
class A {
    char data[8];
public:
    A() {
        strcpy(data, "A::data");
    }
};

class B {
    char data[8];
public:
    B() {
        strcpy(data, "B::data");
    }
};

class C : A, B {
public:
    C() {
    }
};

int main()
{
    C c;
    printf("sizeof(c) == %d\n", sizeof(c));
}
输出结果: sizeof(c) == 16

输出结果: sizeof(c) == 16说明了A和B中各含有一份char data[8],在Python中能实现这样的效果吗。
把C分别用下面四种定义试一下,你就明白了

class C(A,B):
    pass

class C(B,A):
    pass

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

class C(A,B):
    def __init__(self):
        self.data='C'
还可以把id打印出来看一下

个人理解:
C++/Java属于静态语言.类型在编译的时候,就可以确定;
Python属于动态语言,类型是不能在运行时强制转换的;

所以在编译的时候,目标结果类型,不会被转换成父类的实例; 这也就不用考虑父类是否有同名的方法或者数据成员了.


继承,这些年在OO设计的时候已经被慢慢发现了很多缺点了. 多重继承更是噩梦;  如果最顶父类修改了,所有的子类都需要compile一遍; 痛苦.
简单就好,多重继承也没看到有啥可取的地方。


QUOTE:
原帖由 luffy.deng 于 2009-1-11 21:40 发表
把C分别用下面四种定义试一下,你就明白了

class C(A,B):
    pass

class C(B,A):
    pass

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

class C(A,B):
    def _ ...

谢谢,我把id打印出来了

[Copy to clipboard] [ - ]
CODE:
class A:
    def __init__(self):
        self.data = "A"
        print "A.data.id =", id(self.data)

class B:
    def __init__(self):
        self.data = "B"
        print "B.data.id =", id(self.data)

class C(A,B):
    def __init__(self):
        A.__init__(self)
        B.__init__(self)
        self.data = "C"
        print "C.data.id =", id(self.data)

c = C()
print c.data

结果输出:
A.data.id = 13119072
B.data.id = 12465824
C.data.id = 12465792
C

三个id是不一样的,通过c.data访问的是C.data,那么如何通过c访问A和B中的data
class A:
    def __init__(self):
        self.__data = "A"
class B:
    def __init__(self):
        self.__data = "B"
class C(A,B):
    def __init__(self):
        A.__init__(self)
        B.__init__(self)
        self.data='C'


c=C()
print c._A__data
print c._B__data
print c.data


QUOTE:
原帖由 luffy.deng 于 2009-1-12 21:54 发表
class A:
    def __init__(self):
        self.__data = "A"
class B:
    def __init__(self):
        self.__data = "B"
class C(A,B):
    def __init__(self):
        A.__init__(self)
      ...

谢谢,但我又有新问题要请教:

[Copy to clipboard] [ - ]
CODE:
class A:
    def __init__(self):
        self.data = "A"
    def A_get_data(self):
        return self.data

class B:
    def __init__(self):
        self.data = "B"
    def B_get_data(self):
        return self.data

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

c = C()
print c.data
print c.A_get_data()
print c.B_get_data()

打印结果是3个C,我能理解为什么是3个C,但是感觉不合理啊,c.A_get_data返回"A"才比较合理啊。