Python实例属性和类属性的区别
来源:互联网 发布:空气相对湿度计算软件 编辑:程序博客网 时间:2024/05/29 10:10
- # coding: utf-8
- class AAA():
- aaa = 10
- # 情形1
- obj1 = AAA()
- obj2 = AAA()
- print obj1.aaa, obj2.aaa, AAA.aaa
- # 情形2
- obj1.aaa += 2
- print obj1.aaa, obj2.aaa, AAA.aaa
- # 情形3
- AAA.aaa += 3
- print obj1.aaa, obj2.aaa, AAA.aaa
在上面的代码,类AAA定义了一个属性aaa,py的类成员变量不像java或者c++那样有访问限定符,像aaa这样的属性定义应该理解为类属性定义,即该定义为所有类AAA的实例所共享,访问该属性,可通过AAA.aaa的方式来访问,是通过类名来引用,但是如果通过类AAA的实例来引用aaa属性,又会是怎样呢,我们来看情形1.
对于情形1,我相信绝大多数人都会正确的说出结果,那就是:
10 10 10
对于上面这个结果,没有任何悬念,通过两个AAA的实例,以及通过AAA类名引用aaa属性值,都是同样的答案。
那在情形2中,应该是什么结果呢,我相信大多数人还是会说出正确的结果:
12 10 10
在上面这个结果中,一旦执行了obj1.aaa += 2,也就意味着obj1这个实例有了个实例的属性值,他的属性名称也为aaa,那是不是obj1的aaa是个新的属性呢,实际上可以说法是对,但也不对,实际上obj1.aaa += 2这个代码的执行,并不像我们想象的那么简单,首先他会到obj1所属的类AAA的属性列表中去找一个名称为aaa的属性,如果有,他就会返回该值作为obj1中aaa的初始值,也就是说,这以后obj1.aaa的这个属性值跟AAA.aaa就基本没有关系了。
那在情形3中呢,答案是什么呢:
12 13 13
这又怎么说呢,其实很简单,AAA.aaa对AAA类属性做了一次设置,obj1.aaa经过一次+=操作后,实际上与AAA.aaa脱离了关系,而obj2.aaa没有经过任何的属性操作,因此其只会从其所属的类AAA中去获得aaa,并返回。
对于上面的过程,我把代码加上几行,如下:
- # coding: utf-8
- class AAA():
- aaa = 10
- obj1 = AAA()
- obj2 = AAA()
- print obj1.aaa, obj2.aaa, AAA.aaa
- print obj1.__dict__, obj2.__dict__, AAA.__dict__
- obj1.aaa += 2
- print obj1.aaa, obj2.aaa, AAA.aaa
- print obj1.__dict__, obj2.__dict__, AAA.__dict__
- AAA.aaa += 3
- print obj1.aaa, obj2.aaa, AAA.aaa
- print obj1.__dict__, obj2.__dict__, AAA.__dict__
执行该代码,有如下的结果:
10 10 10
{} {} {'__module__': '__main__', 'aaa': 10, '__doc__': None}
12 10 10
{'aaa': 12} {} {'__module__': '__main__', 'aaa': 10, '__doc__': None}
12 13 13
{'aaa': 12} {} {'__module__': '__main__', 'aaa': 13, '__doc__': None}
看了这个结果,我想读者应该明白了,在py中任何东西都是对象,一个类,比如AAA一旦被加载,那么py就会把类AAA也视同为对象,那么AAA的那些实例呢,只会在必要的时候到他这里取一些值去用,这些个实例可都是不同的对象哦,基于这个道理,就很好理解py的这个属性机制了。
- python中类属性和实例属性的区别
- Python实例属性和类属性的区别
- python的类属性和实例属性
- python的类属性和实例属性
- python的类属性和实例属性
- python的类属性和实例属性
- python的类属性和实例属性
- 一个程序理解python的类属性和实例属性(共有属性和私有属性的访问区别)
- python中类属性和类实例的属性的区别
- python中类属性和类实例的属性的区别
- python中实例属性和类属性之间的关系
- 探讨Python的类属性和实例属性
- python 实例属性和类属性
- python 类属性和实例属性
- python中的类属性和实例属性
- Python类属性和实例属性
- Python--类属性和实例属性
- python中的类属性和实例属性
- 安装JDK,配置环境变量
- 一种 IM 删除信息的恢复方法
- linux C++ 进程间共享内存以及临界区的实现
- 【Android Net】Volley实现(multipart/form-data)Post请求
- 整合ssh框架的具体步骤
- Python实例属性和类属性的区别
- Java serve_ client聊天之client端(合工大java实验四)by峰宇
- 读数学之美——统计语言模型(马尔科夫)
- 认识自己——不要小偷小摸不要委屈自己
- ios-day24-01(SQLite数据库之SQL语句:建表、删表、CRUD、主键约束、排序、条件语句等等)
- android 通过组件属性动态创建控件并设置布局
- PHYSICALLY-BASED 小镇的demo
- FMDB
- 解析struts.xml