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 05 Python
详解Django中的过滤器
Jul 16 Python
Python实现自动为照片添加日期并分类的方法
Sep 30 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
python使用正则来处理各种匹配问题
Dec 22 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
Feb 11 Python
使用SQLAlchemy操作数据库表过程解析
Jun 10 Python
Python调用jar包方法实现过程解析
Aug 11 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
python opencv肤色检测的实现示例
Dec 21 Python
python re模块常见用法例举
Mar 01 Python
Python基础之元组与文件知识总结
May 19 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
最贵的咖啡是怎么产生的,它的风味怎么样?
2021/03/04 新手入门
十天学会php之第五天
2006/10/09 PHP
一个php作的文本留言本的例子(四)
2006/10/09 PHP
php 魔术方法使用说明
2009/10/20 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
PHP学习笔记之session
2018/05/06 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
js资料prototype 属性
2007/03/13 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
TensorFlow损失函数专题详解
2018/04/26 Python
Python实现查找最小的k个数示例【两种解法】
2019/01/08 Python
python3实现点餐系统
2019/01/24 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
如何在Django项目中引入静态文件
2019/07/26 Python
自定义django admin model表单提交的例子
2019/08/23 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
任命书怎么写
2015/03/02 职场文书
军事博物馆观后感
2015/06/05 职场文书
在Python中如何使用yield
2021/06/07 Python