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中的floor()方法
May 15 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
python实现二叉查找树实例代码
Feb 08 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
python如何读写json数据
Mar 21 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
通过实例解析Python RPC实现原理及方法
Jul 07 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
python 爬虫请求模块requests详解
Dec 04 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图片验证码实例
2014/03/21 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
PHP实现微信提现功能
2018/09/30 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
Javascript复制实例详解
2016/01/28 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
JavaScript中常用的验证reg
2016/10/13 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
详解vue-cli下ESlint 配置说明
2018/09/03 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
[10:05]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD 选手采访
2021/03/11 DOTA
python使用turtle库绘制树
2018/06/25 Python
用Python读取几十万行文本数据
2018/12/24 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
Python 寻找局部最高点的实现
2019/12/05 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
高中毕业自我鉴定
2013/12/22 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
中学生检讨书1000字
2014/10/28 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
个人培训总结
2015/03/05 职场文书
2015学校年度工作总结
2015/05/11 职场文书
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python