前言

最近在用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中类变量与成员变量的使用注意点总结相关推荐

  1. python类之间方法互相调用_Python中类与类之间属性和方法的调用

    Python中类与类之间属性和方法的调用 class A(object):  #定义一个类 name='python' #类属性 def __init__(self): #实例属性 self.age= ...

  2. python类中的函数调用关系_Python中类的内置方法与继承关系实例

    1.类的内置方法 Python内部类: 所谓内部类,就是在类的内部定义的类,主要目的是为了更好的抽象现实世界. 例子: 汽车是一个类,汽车的底盘轮胎也可以抽象为类,将其定义到汽车内中,而形成内部类, ...

  3. python中的类的属性是什么_python中类属性和数据属性的解释

    python中的类叫class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实例 ...

  4. python类和对象详解_Python公开课 - 详解面向对象

    前言 在C语言中,单纯通过结构化的函数也可以实现很好的软件,顺序思路比较好理解:而C++则以面向对象的思维来进行代码组织,通过定义对象.成员变量.成员函数.以封装.继承和多态等方式来更灵活处理业务逻辑 ...

  5. python类的继承与多态_python类的继承和多态

    现在属于是老年人的脑子,东西写着写着就忘了,东西记着记着就不知道了.之前学C++的时候就把类.对象这块弄得乱七八糟,现在是因为很想玩python,所以就看看python的类和对象. 就像说的,类有三个 ...

  6. python类的定义和创建_Python类对象的创建和使用

    通过前面章节的学习,我们已经学会如何定义一个类,但要想使用它,必须创建该类的对象. 创建类对象的过程,又称为类的实例化. 类名(参数) 定义类时,如果没有手动添加 __init__() 构造方法,又或 ...

  7. python类与对象做项目_python 类和对象

    一.编程范式 1.面向对象编程: 2.面向过程编程: 3.函数式编程 二.面向对象设计 面向对象设计:将一类具体事物的数据和动作整个到一起; 1.我们都学过函数,那么使用函数该怎么实现面向对象设计呢? ...

  8. python类包含对象的个数_python类与对象各个算数运算魔法方法总结

    1.python类与对象各个算术运算魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常 ...

  9. python类属性和实例属性_Python 类属性与实例属性,类对象与实例对象用法分析...

    本文实例讲述了Python 类属性与实例属性,类对象与实例对象用法.分享给大家供大家参考,具体如下: demo.py(类属性,所有实例对象共用类属性): # 定义工具类 继承object是为了兼容py ...

最新文章

  1. Java基础系列--Executor框架(一)
  2. python写了代码_Python写代码的用法建议
  3. Python协程:从yield/send到async/await
  4. (7)数据段权限检查
  5. 技术系列课回顾 | 视频 QoE 的平衡之道
  6. 并发的发展历史-真空管和穿孔打卡
  7. 技巧:Excel用得好,天天没烦恼
  8. linux ntfs 新建,Linux在NTFS中创建的文件的权限
  9. C++:19---重载与模板、模板特例化
  10. hbase 修改表名_hbase修改表名 - 张欢19933的个人空间 - OSCHINA - 中文开源技术交流社区...
  11. jmeter元件的作用域与执行顺序
  12. 域策略(4)——设置统一锁屏壁纸(此策略仅适用于企业版、教育版和 Server SKU版)
  13. happen-before与volatile、final
  14. 我把淘宝当副业,一年全款买了房:你看不起的行业,真的很赚钱
  15. html语言中的双冒号,css单冒号和双冒号用法和区别
  16. win11右击文件夹假死
  17. 快速扫盲 | 霍尔传感器的工作原理
  18. 【spark】spark介绍
  19. 纽约大学计算机研究生案例,纽约大学计算机工程专业硕士案例
  20. 计算机应用基础第四版答案周南岳,计算机应用基础第周南岳win+office期末复习及答案.docx...

热门文章

  1. SAP Cloud for Customer里的individual customer OData服务
  2. HubSpot company数据在UI上的展示和通过API方式进行获取
  3. 2015-03-19 My Appointment text read case
  4. Angular filter test
  5. PHP调试环境搭建的一些常见问题
  6. HANA Calculation View
  7. 某些equipment无法顺利download到CRM的原因
  8. User status profile field in WebUI
  9. workaround for error message Table maintenance not allowed for table XXX
  10. Cloud for Customer custom BO创建时间随着行项目数量增加而增加的关系