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处理JSON数据并生成条形图
Aug 05 Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 Python
Python使用psutil获取进程信息的例子
Dec 17 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
Python random库使用方法及异常处理方案
Mar 02 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
python requests.get带header
May 05 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 Python
Python基础之字符串格式化详解
Apr 21 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
基于jquery的气泡提示效果
2010/05/31 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
JavaScript中的substr()方法使用详解
2015/06/06 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
python中列表元素连接方法join用法实例
2015/04/07 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
python脚本实现验证码识别
2018/06/07 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
Exception类的常用方法
2012/06/16 面试题
环境工程毕业生自荐信
2013/11/17 职场文书
给朋友的道歉信
2014/01/09 职场文书
如何写一封打动人心的求职信
2014/02/17 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技