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提取内容关键词的方法
Mar 16 Python
python比较2个xml内容的方法
May 11 Python
Python 专题二 条件语句和循环语句的基础知识
Mar 19 Python
python实现简易数码时钟
Feb 19 Python
对python调用RPC接口的实例详解
Jan 03 Python
基于python生成器封装的协程类
Mar 20 Python
python调用摄像头拍摄数据集
Jun 01 Python
pandas DataFrame索引行列的实现
Jun 04 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
python绘制随机网络图形示例
Nov 21 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
简单了解python列表和元组的区别
May 14 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 星际争霸
编译问题
2006/10/09 PHP
PHP入门
2006/10/09 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
javascript与cookie 的问题详解
2013/11/11 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
python格式化字符串实例总结
2014/09/28 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
《影子》教学反思
2014/02/21 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
浅析JavaScript中的变量提升
2022/06/01 Javascript