Python的类实例属性访问规则探讨


Posted in Python onJanuary 30, 2015

一般来说,在Python中,类实例属性的访问规则算是比较直观的。

但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此。

在这里,我们需要明白以下几个地方:

1.Python是一门动态语言,任何实体都可以动态地添加或删除属性。
2.一个类定义了一个作用域。
3.类实例也引入了一个作用域,这与相应类定义的作用域不同。
4.在类实例中查找属性的时候,首先在实例自己的作用域中查找,如果没有找到,则再在类定义的作用域中查找。
5.在对类实例属性进行赋值的时候,实际上会在类实例定义的作用域中添加一个属性(如果还不存在的话),并不会影响到相应类中定义的同名属性。

下面看一个例子,加深对上述几点的理解:

class A:

      cls_i = 0

      cls_j = {}

      def __init__(self):

            self.instance_i = 0

            self.instance_j = {}

在这里,我们先定义类A的一个实例a,然后再看看类A的作用域和实例a的作用域中分别有什么:
>>> a = A()

>>> a.__dict__

{'instance_j': {}, 'instance_i': 0}

>>> A.__dict__

{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {}, '__doc__': None}

我们看到,a的作用域中有instance_i和instance_j,A的作用域中有cls_i和cls_j。

我们再来看看名字查找是如何发生的:

>>> a.cls_i

0

>>> a.instance_i

0

在查找cls_i的时候,实例a的作用域中是没有它的,却在A的作用域中找到了它;在查找instance_i的时候,直接可在a的作用域中找到它。

如果我们企图通过实例a来修改cls_i的值,那会怎样呢:

>>> a.cls_i = 1

>>> a.__dict__

{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}

>>> A.__dict__

{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {}, '__doc__': None}

我们可以看到,a的作用域中多了一个cls_i属性,其值为1;同时,我们也注意到A作用域中的cls_i属性的值仍然为0;在这里,我们其实是增加了一个实例属性,并没有修改到类属性。

如果我们通过实例a操纵cls_j中的数据(注意不是cls_j本身),又会怎么样呢:

>>> a.cls_j['a'] = 'a'

>>> a.__dict__

{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}

>>> A.__dict__

{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {'a': 'a'}, '__doc__': None}

我们可以看到a的作用域没有发生什么变化,但是A的作用域发生了一些变化,cls_j中的数据发生了变化。

实例的作用域发生变化,并不会影响到该类的其它实例,但是类的作用域发生变化,则会影响到该类的所有实例,包括在这之前创建的实例:

>>> A.cls_k = 0

>>> i.cls_k

0
Python 相关文章推荐
python过滤字符串中不属于指定集合中字符的类实例
Jun 30 Python
Python实现以时间换空间的缓存替换算法
Feb 19 Python
详解Python读取配置文件模块ConfigParser
May 11 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
详谈python read readline readlines的区别
Sep 22 Python
用tensorflow实现弹性网络回归算法
Jan 09 Python
python如何统计序列中元素
Jul 31 Python
python3 字符串知识点学习笔记
Feb 08 Python
python实现批量命名照片
Jun 18 Python
python利用pytesseract 实现本地识别图片文字
Dec 14 Python
python re.match()用法相关示例
Jan 27 Python
解决pytorch 模型复制的一些问题
Mar 03 Python
Python中的作用域规则详解
Jan 30 #Python
Python中使用Boolean操作符做真值测试实例
Jan 30 #Python
Python中的zip函数使用示例
Jan 29 #Python
Python的另外几种语言实现
Jan 29 #Python
python中使用xlrd、xlwt操作excel表格详解
Jan 29 #Python
Python中实现常量(Const)功能
Jan 28 #Python
Python使用random和tertools模块解一些经典概率问题
Jan 28 #Python
You might like
JAVA/JSP学习系列之六
2006/10/09 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
js正则表达式的使用详解
2013/07/09 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
es6数组之扩展运算符操作实例分析
2020/04/25 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
开水果连锁店创业计划书
2013/12/29 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
超市中秋节促销方案
2014/03/21 职场文书
委托书如何写
2014/08/30 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
病房管理制度范本
2015/08/06 职场文书
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS