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中fileno()方法的使用
May 24 Python
python从入门到精通(DAY 2)
Dec 20 Python
Python模拟百度登录实例详解
Jan 20 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
pip命令无法使用的解决方法
Jun 12 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
快速排序的四种python实现(推荐)
Apr 03 Python
Django CBV类的用法详解
Jul 26 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
如何基于python生成list的所有的子集
Nov 11 Python
python中return如何写
Jun 18 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安装为Apache DSO
2006/10/09 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
向左滚动文字 js代码效果
2013/08/17 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
vue实现通讯录功能
2018/07/14 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
JS根据json数组多个字段排序及json数组常用操作
2019/06/06 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
在Python中表示一个对象的方法
2019/06/25 Python
python调用支付宝支付接口流程
2019/08/15 Python
使用python制作一个解压缩软件
2019/11/13 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
python线程join方法原理解析
2020/02/11 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
python3.7调试的实例方法
2020/07/21 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
比利时香水网上商店:NOTINO
2018/03/28 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
Java如何支持I18N?
2016/10/31 面试题
护理专业学生的求职信范文
2013/12/11 职场文书
关于环保的建议书400字
2014/03/12 职场文书
工程售后服务方案
2014/06/08 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
大学生十八大感想
2015/08/11 职场文书
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
超详细Python解释器新手安装教程
2021/05/10 Python
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS