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实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
Python模拟用户登录验证
Sep 11 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
详解Numpy中的广播原则/机制
Sep 20 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
Django Channel实时推送与聊天的示例代码
Apr 30 Python
Python sorted对list和dict排序
Jun 09 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
python 爬取英雄联盟皮肤并下载的示例
Dec 04 Python
Python实现抖音热搜定时爬取功能
Mar 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
神族 Protoss 历史背景
2020/03/14 星际争霸
PHP内置的Math函数效率测试
2014/12/01 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
php swoft框架实例用法
2020/12/22 PHP
JavaScript中URL编码函数代码
2011/01/11 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
Python中防止sql注入的方法详解
2017/02/25 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
python中copy()与deepcopy()的区别小结
2018/08/03 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
python实现飞机大战游戏
2020/10/26 Python
用python做游戏的细节详解
2019/06/25 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
Python中关于浮点数的冷知识
2019/09/22 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
爱游人:Travelliker
2017/09/05 全球购物
标记环介质访问控制协议
2016/03/27 面试题
五年后的职业生涯规划
2014/03/04 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
金融管理专业求职信
2014/07/10 职场文书
教师党员整改措施
2014/10/24 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书