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微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
Python列表生成式与生成器操作示例
Aug 01 Python
pycharm运行出现ImportError:No module named的解决方法
Oct 13 Python
Python文件常见操作实例分析【读写、遍历】
Dec 10 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
python画微信表情符的实例代码
Oct 09 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
python中的Elasticsearch操作汇总
Oct 30 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
Python单元测试及unittest框架用法实例解析
Jul 09 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的FTP学习(三)
2006/10/09 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
php内存缓存实现方法
2015/01/24 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
jquery实现简单实用的打分程序实例
2015/07/23 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
微信小程序 页面跳转事件绑定的实例详解
2017/09/20 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
python里对list中的整数求平均并排序
2014/09/12 Python
详解Django中的权限和组以及消息
2015/07/23 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
python django生成迁移文件的实例
2019/08/31 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
Python里面如何实现tuple和list的转换
2012/06/13 面试题
生产车间主管岗位职责
2013/12/28 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android
nginx结合openssl实现https的方法
2021/07/25 Servers