python中类变量与成员变量的使用注意点总结
作者:Myths 时间:2022-01-08 03:39:51
前言
最近在用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就会生成一个该对象的副本,以后的操作都是基于这个副本而不会对原来的类对象造成影响。这样就解释的通上面的现象了。
那么为了杜绝自己忘记类变量和实例变量的区别导致本不想公用变量的时候公用了变量,最好的办法就是在每个类中使用变量的时候重新初始化一下,这样就不会导致意外了。
来源:https://blog.mythsman.com/2016/09/04/1/
标签:python,成员变量,类变量
0
投稿
猜你喜欢
python中的sys模块和os模块
2021-07-06 00:43:17
JavaScript实现简单MD5加密的脚本分享
2023-07-02 03:47:49
MySQL中批量删除指定前缀表的sql语句
2024-01-17 07:37:07
Python网页正文转换语音文件的操作方法
2021-03-26 04:27:30
VSCode必装Go语言以下插件的思路详解
2024-04-30 09:53:42
Python文字截图识别OCR工具实例解析
2021-07-02 12:58:20
python基础知识之字典(Dict)
2023-08-25 20:01:44
Python3爬虫中关于中文分词的详解
2023-08-12 23:10:28
详解python statistics模块及函数用法
2021-09-18 00:08:19
VSCode远程SSH免密登录配置实现
2024-01-04 19:17:07
Python OpenCV读取png图像转成jpg图像存储的方法
2023-01-07 13:23:56
SQL语句执行顺序图文介绍
2023-07-04 22:59:27
Spring Boot集成MyBatis访问数据库的方法
2024-01-23 06:45:43
java学习指南之字符串与正则表达式
2022-02-23 14:05:50
python单例模式的多种实现方法
2023-05-01 12:05:04
三个520专属Python表白代码分享
2023-09-19 21:20:06
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2022-10-12 22:54:02
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2023-03-07 19:19:59
Django模板语言 Tags使用详解
2022-09-27 23:37:35
一文带你搞懂Golang依赖注入的设计与实现
2023-07-23 14:33:53