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字典键值对的添加和遍历方法
Sep 11 Python
python实现可以断点续传和并发的ftp程序
Sep 13 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
Python3.7 dataclass使用指南小结
Feb 22 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
jupyter notebook oepncv 显示一张图像的实现
Apr 24 Python
python2.7使用scapy发送syn实例
May 05 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 Python
pycharm debug 断点调试心得分享
Apr 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
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
删除重复数据的算法
2006/11/23 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
jquery获取radio值实例
2014/10/16 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
2016/12/14 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
用Python写的图片蜘蛛人代码
2012/08/27 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
python实现批量下载新浪博客的方法
2015/06/15 Python
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
大学生创业计划书的用途
2014/01/08 职场文书
学期评语大全
2014/04/30 职场文书
经营理念口号
2014/06/21 职场文书
安全环保演讲稿
2014/08/28 职场文书
五年级上册复习计划
2015/01/19 职场文书
物业工程部岗位职责
2015/02/11 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书