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 相关文章推荐
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
python文件和目录操作方法大全(含实例)
Mar 12 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
python导出chrome书签到markdown文件的实例代码
Dec 27 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
selenium+python截图不成功的解决方法
Jan 30 Python
Python 串口读写的实现方法
Jun 12 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
python爬虫 爬取超清壁纸代码实例
Aug 16 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
Python进程的通信Queue、Pipe实例分析
Mar 30 Python
基于django micro搭建网站实现加水印功能
May 22 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获取apk包信息的方法
2014/08/15 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
Python中多线程thread与threading的实现方法
2014/08/18 Python
python实现基本进制转换的方法
2015/07/11 Python
Python中random模块生成随机数详解
2016/03/10 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
Python hmac模块使用实例解析
2019/12/24 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
特色蛋糕店创业计划书
2014/01/28 职场文书
红领巾广播站广播稿
2014/02/01 职场文书
法人任命书范本
2014/06/04 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
班级出游活动计划书
2014/08/15 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
施工安全员岗位职责
2015/04/11 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书
企业战略合作意向书
2015/05/08 职场文书
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers