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 相关文章推荐
Ruby元编程基础学习笔记整理
Jul 02 Python
Python之list对应元素求和的方法
Jun 28 Python
Python hexstring-list-str之间的转换方法
Jun 12 Python
Django rest framework jwt的使用方法详解
Aug 08 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
python科学计算之numpy——ufunc函数用法
Nov 25 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
Python实现汇率转换操作
May 03 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
python操作链表的示例代码
Sep 27 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的可变变量名的使用方法分享
2012/02/05 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
微信红包随机生成算法php版
2016/07/21 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
2015/08/23 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
vue中的数据绑定原理的实现
2018/07/02 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
python中threading超线程用法实例分析
2015/05/16 Python
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
2014年度培训工作总结
2014/11/27 职场文书
给客户的感谢信
2015/01/21 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
公司催款律师函
2015/05/27 职场文书
《称赞》教学反思
2016/02/17 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android