这里有新鲜出炉的 Python 多线程编程,程序狗速度看过来!
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
python 的类中主要会使用的两种变量: 类变量与成员变量。类变量是类所有实例化对象共有的,而成员变量是每个实例化对象自身特有的。下面这篇文章主要给大家介绍了在 python 中类变量与成员变量的一些使用注意点,需要的朋友可以参考借鉴,下面来一起看看吧。
前言
最近在用 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.y
- print A.x,A.y
- a.add()
- print a.x,a.y
- print A.x,A.y
- b=A()
- print b.x,b.y
- print 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 就会生成一个该对象的副本,以后的操作都是基于这个副本而不会对原来的类对象造成影响。这样就解释的通上面的现象了。
那么为了杜绝自己忘记类变量和实例变量的区别导致本不想公用变量的时候公用了变量,最好的办法就是在每个类中使用变量的时候重新初始化一下,这样就不会导致意外了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对 PHPERZ 的支持。
来源: http://www.phperz.com/article/17/0512/334855.html