Python 父类、子类的数据掺杂到一起了?
来源:互联网 发布:淘宝店铺活动图片 编辑:程序博客网 时间:2024/05/01 15:40
以此为例:
class A:
attr_list = []
def __init__(self, attr_list = []):
self.attr_list = attr_list
def __del__(self):
del self.attr_list[:]
def addAttr(self, attr):
self.attr_list.append(attr)
class B(A):
def __init__(self):
pass
class C(A):
def __init__(self):
pass
b = B()
c = C()
b.addAttr(1)
c.addAttr(2)
for attr in b.attr_list:
print attr ## 此处输出1,2
for attr in c.attr_list:
print attr ## 此处也输出1,2
奇怪了,从基类A派生出两个不同的子类B、C,分别定义了一个实例b、c并各自添加数据1、2,怎么会导致两个实例中的数据都是1,2呢?难道他们用的是一个地址?好说,来,来验证一下!
print id(b.attr_list)
print id(c.attr_list)
打印出来的两个地址果然是一样的,原来如此!那为什么会这样呢?
仔细看,才发现原因出在A中attr_list定义的位置不对,对python而言,在类名和__init__之前定义的变量(注意,这时候是不能用self的,因为不识别),是类全局的, 可以认为和C++类中的静态变量等价,这样就可以解释了。
那究竟应该怎么定义类的普通变量呢?简单,在__init__函数中,使用self来定义就OK了,改造如下:
class A: ##不要在此处和__init__之间定义普通变量,除非你真的想用它做静态变量,否则。。。
def __init__(self, attr_list = []):
self.attr_list = attr_list
而且还有一个注意点,子类B、C的__init__函数中,首行就应该先调用父类A的__init__函数,__del__如是。
改造如下:
class A:
def __init__(self, attr_list = []):
self.attr_list = attr_list
def __del__(self):
del self.attr_list[:]
def addAttr(self, attr):
self.attr_list.append(attr)
class B(A):
def __init__(self):
A.__init__(self)
class C(A):
def __init__(self):
A.__init__(self)
再次分别声明变量b、c并添加1、2,打印出来看看,哈哈,果然分开了,分别是1、2.
看来还是自己对python的机制理解不够,导致出现这种使用问题,不过吃一堑长一智,还是很幸运。
- Python 父类、子类的数据掺杂到一起了?
- Chart.js 横坐标太挤,数据挤到一起了,咋整?
- 重要又容易混淆的基础概念,看了好多帖子,拼到一起了
- 子类父类的成员变量一起初始化的方法
- Python中子类的创建
- 利用javascript把javascript的数据同form的数据一起发送到servlet中
- Python的package安装到哪里了?
- python 父类、子类,迭代器、生成器
- Max插件编写,为了提升工作效率,把工作中常用到的命令集成到一起了
- 从能级的角度来看半导体的掺杂
- “少儿编程Scratch到Python”让我们一起谱写美好的未来
- VC的编译器能将数据与代码编译到一起
- android开发中,导入有数据的sqlite,与apk一起安装到手机上
- 父类取子类GET到的东西
- python的logging模块handle的子类
- python:Process、join()、进程的创建Process子类、进程池Pool、将一个文件夹的内容copy到另一个文件夹
- 天啊,Google竟然和微软走到一起了
- 江苏电信怎么和乐视“勾搭”到一起了
- architecture&platform&system&framework
- POJ1135 多米诺效应(单源最短路径+枚举)
- centOS fcitx
- STL 容器适配器
- LED滚动显示算法及实现
- Python 父类、子类的数据掺杂到一起了?
- 转载一篇写的不错的python装饰器
- 大杂烩
- 学习java要经常看的网站
- 习主席访腾讯 一家获赠QQ帐号!腾讯太丢人现眼! 马化腾能不能男人一点,硬一点!
- PB中设置各种窗口风格的API
- c++面试必须知道的问题
- Ryzom的文件
- ActionContext_、ValueStack、Stack_Context关系