免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11855 | 回复: 8
打印 上一主题 下一主题

Python的多继承 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-11 18:27 |只看该作者 |倒序浏览
类A含有一个私有变量data,类B也含有一个私有变量data,它们名称恰好相同,但是在不同的类中有不同的作用,类C继承与A和B,如何才能做到让A和B各自拥有一份自己的data?

  1. class A:
  2.     def __init__(self):
  3.         self.data = "A"

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

  7. class C(A,B):
  8.     def __init__(self):
  9.         A.__init__(self)
  10.         B.__init__(self)

  11. c = C()
  12. print c.data
  13. 输出结果:B,好像data是共享的?
复制代码

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

  1. #include <stdio.h>
  2. class A {
  3.     char data[8];
  4. public:
  5.     A() {
  6.         strcpy(data, "A::data");
  7.     }
  8. };

  9. class B {
  10.     char data[8];
  11. public:
  12.     B() {
  13.         strcpy(data, "B::data");
  14.     }
  15. };

  16. class C : A, B {
  17. public:
  18.     C() {
  19.     }
  20. };

  21. int main()
  22. {
  23.     C c;
  24.     printf("sizeof(c) == %d\n", sizeof(c));
  25. }
  26. 输出结果: sizeof(c) == 16
复制代码

输出结果: sizeof(c) == 16说明了A和B中各含有一份char data[8],在Python中能实现这样的效果吗。

论坛徽章:
0
2 [报告]
发表于 2009-01-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 __init__(self):
        self.data='C'
还可以把id打印出来看一下

[ 本帖最后由 luffy.deng 于 2009-1-11 21:41 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-01-11 22:42 |只看该作者
不喜欢多继承这种乱伦行为

论坛徽章:
0
4 [报告]
发表于 2009-01-12 08:40 |只看该作者
个人理解:
C++/Java属于静态语言.类型在编译的时候,就可以确定;
Python属于动态语言,类型是不能在运行时强制转换的;

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


继承,这些年在OO设计的时候已经被慢慢发现了很多缺点了. 多重继承更是噩梦;  如果最顶父类修改了,所有的子类都需要compile一遍; 痛苦.

论坛徽章:
0
5 [报告]
发表于 2009-01-12 09:05 |只看该作者
简单就好,多重继承也没看到有啥可取的地方。

论坛徽章:
0
6 [报告]
发表于 2009-01-12 13:44 |只看该作者
原帖由 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打印出来了

  1. class A:
  2.     def __init__(self):
  3.         self.data = "A"
  4.         print "A.data.id =", id(self.data)

  5. class B:
  6.     def __init__(self):
  7.         self.data = "B"
  8.         print "B.data.id =", id(self.data)

  9. class C(A,B):
  10.     def __init__(self):
  11.         A.__init__(self)
  12.         B.__init__(self)
  13.         self.data = "C"
  14.         print "C.data.id =", id(self.data)

  15. c = C()
  16. print c.data

  17. 结果输出:
  18. A.data.id = 13119072
  19. B.data.id = 12465824
  20. C.data.id = 12465792
  21. C
复制代码

三个id是不一样的,通过c.data访问的是C.data,那么如何通过c访问A和B中的data

论坛徽章:
0
7 [报告]
发表于 2009-01-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)
        B.__init__(self)
        self.data='C'


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

论坛徽章:
0
8 [报告]
发表于 2009-01-12 22:32 |只看该作者
原帖由 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)
      ...

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

  1. class A:
  2.     def __init__(self):
  3.         self.data = "A"
  4.     def A_get_data(self):
  5.         return self.data

  6. class B:
  7.     def __init__(self):
  8.         self.data = "B"
  9.     def B_get_data(self):
  10.         return self.data

  11. class C(A,B):
  12.     def __init__(self):
  13.         A.__init__(self)
  14.         B.__init__(self)
  15.         self.data = "C"

  16. c = C()
  17. print c.data
  18. print c.A_get_data()
  19. print c.B_get_data()
复制代码

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

论坛徽章:
0
9 [报告]
发表于 2011-10-06 17:22 |只看该作者
在研究python的多重继承,看到这篇帖子,这个探讨一下

python的语句都是按顺序执行的,后面的覆盖了前面的
所以 c的instance执行后,self.data = C
之后不管调用 继承自Class A 还是 Class B的method
返回值都是 self.data
结束。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP