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 实现自动远程登陆scp文件实例代码
Mar 13 Python
python2.7 mayavi 安装图文教程(推荐)
Jun 22 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
python 实现语音聊天机器人的示例代码
Dec 02 Python
python Pexpect 实现输密码 scp 拷贝的方法
Jan 03 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
Feb 17 Python
Python使用修饰器进行异常日志记录操作示例
Mar 19 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
Python玩转PDF的各种骚操作
May 06 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
Python脚本实现监听服务器的思路代码详解
May 28 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 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编码规范-php coding standard
2007/03/16 PHP
php学习之数据类型之间的转换介绍
2011/06/09 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
Vue包大小优化的实现(从1.72M到94K)
2021/02/18 Vue.js
Python读写Excel文件的实例
2013/11/01 Python
python随机生成指定长度密码的方法
2015/04/04 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
2019/02/22 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
python 实现任务管理清单案例
2020/04/25 Python
中国旅游网站:同程旅游
2016/09/11 全球购物
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
护理助产毕业生的求职信
2014/03/02 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
委托书的写法
2014/09/16 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
详解python的异常捕获
2022/03/03 Python