python中类变量与成员变量的使用注意点总结


Posted in Python onApril 29, 2017

前言

最近在用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就会生成一个该对象的副本,以后的操作都是基于这个副本而不会对原来的类对象造成影响。这样就解释的通上面的现象了。

那么为了杜绝自己忘记类变量和实例变量的区别导致本不想公用变量的时候公用了变量,最好的办法就是在每个类中使用变量的时候重新初始化一下,这样就不会导致意外了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
使用python BeautifulSoup库抓取58手机维修信息
Nov 21 Python
在Python的Flask框架中使用日期和时间的教程
Apr 21 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
浅谈Python浅拷贝、深拷贝及引用机制
Dec 15 Python
Python 异常处理的实例详解
Sep 11 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
解决Django migrate No changes detected 不能创建表的问题
May 27 Python
对Python3中dict.keys()转换成list类型的方法详解
Feb 03 Python
查看已安装tensorflow版本的方法示例
Apr 19 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
Oct 27 Python
怎么用Python识别手势数字
Jun 07 Python
Python urls.py的三种配置写法实例详解
Apr 28 #Python
Python HTTP客户端自定义Cookie实现实例
Apr 28 #Python
Python 通过pip安装Django详细介绍
Apr 28 #Python
python 使用get_argument获取url query参数
Apr 28 #Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 #Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 #Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 #Python
You might like
php标签云的实现代码
2012/10/10 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
js切换光标示例代码
2013/10/10 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
Python编程实现正则删除命令功能
2017/08/30 Python
Python编程求质数实例代码
2018/01/31 Python
python安装twisted的问题解析
2018/08/21 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
yy司仪主持词
2014/03/22 职场文书
企业文化建设实施方案
2014/03/22 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
人事文员岗位职责
2015/02/04 职场文书
美术教师个人工作总结
2015/02/06 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
python中print格式化输出的问题
2021/04/16 Python
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
SQL Server中锁的用法
2022/05/20 SQL Server