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使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
python搭建微信公众平台
Feb 09 Python
python破解zip加密文件的方法
May 31 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
解析Python的缩进规则的使用
Jan 16 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
python os.fork() 循环输出方法
Aug 08 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
详解Python设计模式之策略模式
Jun 15 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
python如何利用Mitmproxy抓包
Oct 10 Python
Python中tqdm的使用和例子
Sep 23 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实现数据分页显示的简单实例
2016/05/26 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
python计算N天之后日期的方法
2015/03/31 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
python模块如何查看
2020/06/16 Python
Python 如何对文件目录操作
2020/07/10 Python
python 将Excel转Word的示例
2021/03/02 Python
法国珠宝店:CLEOR
2017/01/29 全球购物
保时捷设计:Porsche Design
2019/03/30 全球购物
网站设计师的岗位职责
2013/11/21 职场文书
学子宴答谢词
2014/01/25 职场文书
青年教师培训方案
2014/02/06 职场文书
外语系大学生自荐信范文
2014/03/01 职场文书
企业挂职心得体会
2014/09/10 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书