python的类属性和实例属性
来源:互联网 发布:js控制input显示隐藏 编辑:程序博客网 时间:2024/05/16 05:19
一、简介
类属性:类属性仅与其被定义的类相绑定,类属性仅当需要有更加“静态”数据类型时才变得有用,它和任何实例都无关,如class A():count = 10;。实例属性:实例仅拥有数据属性,它是与某个类的实例相关联的数据值,这些值独立于其他实例或类。当一个实例被释放后,它的属性同时也被清除了,如class A():def __init__(self):self.number = 10;同时实例属性可以在类外声明,如class A():pass,a = A(),a.count = 20。
二、详解
1、Python下测试
python的实例属性必须在__init__(self) 方法中定义(若没有定义,只是引用访问的仍是类属性),直接跟在类名后边定义的属性都默认是类属性(类似于c++的static变量)。>>> class A:... count = 10;... >>> a = A()>>> b = A()>>> print A.count #类属性可以通过类名直接引用10>>> print a.count, b.count #因仅是引用,访问的是类属性10 10>>> a.count = 20 #定义实例属性,覆盖类属性>>> print A.count, a.count, b.count10 20 10>>> A.count = -1>>> print A.count, a.count, b.count-1 20 -1>>> a.__class__.count-1
2、警示程序
(1)代码:#encoding=utf-8import sysclass Model(): model_path = "class_path" model_dict = {'1':'linux'} def __init__(self, path = None): self.reload(path) def reload(self, path = None): if not path: return #self.model_dict = {} #定义,实例属性 self.model_dict.clear() #没有定义,访问的是类属性 self.model_dict['2'] = 'unix' self.model_path = path;def main(): m1 = Model(); m2 = Model(); print Model.model_path print Model.model_dict m1.reload("instance_m1_path") m2.reload("instance_m2_path") print '#'*15 print m1.model_path print m2.model_path print Model.model_path print '#'*15 print m1.model_dict print Model.model_dict print m2.model_dict print Model.model_dict return 0main()运行结果:
class_path{'1': 'linux'}###############instance_m1_pathinstance_m2_pathclass_path###############{'2': 'unix'}{'2': 'unix'}{'2': 'unix'}{'2': 'unix'}原因:
1、self.model_path=path; #这对self.model_path进行了赋值,python中的第一次赋值视为变量的定义!
2、self.xxxx这种格式的第一次赋值含义是什么呢?-->含义是:定义,也就是说定义了一个名为xxxx的实例属性。
3、因此m1,m2的两次调用,分别定义了对应的(不同的)self.model_path属性。而self.model_dict,从头到尾都是引用它,从未进行过赋值(重定义),所以引用的都是类属性。
(2)若增加self.model_dict = {}的定义:
#encoding=utf-8import sysclass Model(): model_path = "class_path" model_dict = {'1':'linux'} def __init__(self, path = None): self.reload(path) def reload(self, path = None): if not path: return self.model_dict = {} #定义,实例属性 self.model_dict.clear() #没有定义,访问的是类属性 self.model_dict['2'] = 'unix' self.model_path = path;def main(): m1 = Model(); m2 = Model(); print Model.model_path print Model.model_dict m1.reload("instance_m1_path") m2.reload("instance_m2_path") print '#'*15 print m1.model_path print m2.model_path print Model.model_path print '#'*15 print m1.model_dict print Model.model_dict print m2.model_dict print Model.model_dict return 0main()运行结果:
class_path{'1': 'linux'}###############instance_m1_pathinstance_m2_pathclass_path###############{'2': 'unix'}{'1': 'linux'}{'2': 'unix'}{'1': 'linux'}
三、总结
(1)python的属性机制值得好好比较,这样才能防止数据的错乱。(2)若有建议,请留言,在此先感谢!
0 0
- python的类属性和实例属性
- python的类属性和实例属性
- python的类属性和实例属性
- python的类属性和实例属性
- python的类属性和实例属性
- python中类属性和实例属性的区别
- Python实例属性和类属性的区别
- python中实例属性和类属性之间的关系
- 探讨Python的类属性和实例属性
- python 实例属性和类属性
- python 类属性和实例属性
- python中的类属性和实例属性
- Python类属性和实例属性
- Python--类属性和实例属性
- python中的类属性和实例属性
- Python 类属性和实例属性
- python中的类属性和实例属性
- python类属性和实例属性
- Spring MVC过滤器-登录过滤
- http://www.javaapk.com
- 开发中的一些小细节
- linux mount (挂载命令)详解
- webstorm+Cocos2d-js
- python的类属性和实例属性
- hibernate映射文件报错
- iOS 9 适配HTTP请求拒绝问题
- [hadoop2.7.1]I/O之Writable的实现类及子接口
- Android学习之路
- 151020 顺便ak祝自己生日快乐
- iOS之UI高级---触摸事件
- BZOJ 3992 [SDOI2015]序列统计 NTT
- Android实现交错的GridView视图