Python类变量和成员变量使用中有哪些注意事项?
来源:互联网 发布:linux的用户组是什么 编辑:程序博客网 时间:2024/05/01 22:20
之前在用python开发一个项目,发现一个bug,就是同由一个类生成的两个实例之间的数据竟然会相互影响,这让我非常不解。后来联想到java的类有类变量也有实例变量,因此翻阅了相关资料,发现python也有类似的类变量和实例变量,比如下面的代码中:
class A:
x = 0
def __init__(self):
self.y = 0
x就是类变量,y就是实例变量。
原则上是没有错的,但是实际用的时候就发现一些恶心的问题(也就是我找了三天的bug)。。。比如下面的代码:
class A:
x = []
y = 0
def __init__(self):
pass
def add(self):
self.x.append('1')
self.y+=1
a=A() print a.x,a.yprint A.x,A.y
a.add()print a.x,a.yprint A.x,A.y
b=A() print b.x,b.yprint A.x,A.y
这里很明显x和y都是类变量,add的作用是分别对x和y做出修改。然后构造一个实例a,对实例a的值进行修改,最后构造实例b。
本以为这个结果是显而易见的,然而他输出的结果却是:
[] 0
[] 0
['1'] 1
['1'] 0
['1'] 0
['1'] 0
问题在哪?明明x和y都是类变量,在第二组print中为什么a.x和b.x一样,但是a.y和b.y就是不一样呢?
想了半天悟了一个道理。。。就是对于python来说,类变量的确是所有类共有的东西。但是那是在我们用的同一个引用的情况下,比如对于[]对象的append方法就是公用一个类变量了;但是对于赋值语句来说,如果在类中对类变量使用了赋值语句,那么python就会生成一个该对象的副本,以后的操作都是基于这个副本而不会对原来的类对象造成影响。这样就解释的通上面的现象了。
那么为了杜绝自己忘记类变量和实例变量的区别导致本不想公用变量的时候公用了变量,最好的办法就是在每个类中使用变量的时候重新初始化一下,这样就不会导致意外了
来源:Myths的个人博客
- Python类变量和成员变量使用中有哪些注意事项?
- python中的类变量、成员变量和成员函数的局部变量使用
- python的类变量和成员变量
- Python中的类变量和成员变量
- Python中的类变量和成员变量
- Python中的类变量和成员变量
- python的类变量和成员变量
- Python类变量和成员变量
- 运行时,看有哪些成员变量
- Python的类变量和成员变量以及局部变量
- python类成员变量和实例成员变量
- 面试题:说说Java中接口、类、成员变量、成员方法、构造方法有哪些访问修饰符和他们的作用范围
- java中有哪些变量?
- C++类中成员变量和成员指针变量小结
- python 类成员变量
- Python中定义“私有”成员变量和成员函数
- Python中定义“私有”成员变量和成员函数
- Python中定义“私有”成员变量和成员函数
- 游戏的AOI算法
- hdu4289—Control(最大流)
- DevOps、敏捷开发、云计算,三剑客的小时代
- C++实现顺序表
- opencv Rodrigues函数调用问题
- Python类变量和成员变量使用中有哪些注意事项?
- 集合的划分(重复状态的消除)
- Rabbitmq java client编译
- 内部类
- 防侧漏之弱引用的使用
- 求1-100之间6的倍数的个数,并把能被6整除的数存入数组中
- Python 版本切换pyenv常用命令
- Oracle数据的运算符-yellowcong
- c++ winpcap开发(10)