python中类的属性一般来说_python中实例属性和类属性之间的关系
匿名用户
1级
2018-06-25 回答
一般来说,在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
python中类的属性一般来说_python中实例属性和类属性之间的关系相关推荐
- python中的引用类型_Python 中的引用和类属性的初步理解
最近对Python 的对象引用机制稍微研究了一下,留下笔记,以供查阅. 首先有一点是明确的:「Python 中一切皆对象」. 那么,这到底意味着什么呢? 如下代码: #!/usr/bin/env py ...
- python修改类的属性值_python 四种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,直接修改类属性的值...
三种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,类名就是类对象,city就是类变量, #coding=utf-8 class empl ...
- 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...
关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...
- 面向过程和面向对象的编程思想 复习原型 构造函数和实例对象和原型对象之间的关系
体会面向过程和面向对象的编程思想 <!DOCTYPE html> <html lang="en"> <head><meta charset ...
- storm中worker、executor、task之间的关系
这里做一些补充: worker是一个进程,由supervisor启动,并只负责处理一个topology,所以不会同时处理多个topology. executor是一个线程,由worker启动,是运行t ...
- IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类
IntelliJ IDEA 中如何查看一个类的所有继承关系,包括父类与子类 查看当前类所有的父类 查看当前所有的子类 查看当前类所有的父类 1.找到当前类所在的位置,右键选择Diagrams,然后选择 ...
- GPS 数据中的精度因子(DOP)与协方差之间的关系 (参考链接)
GPS 数据中的精度因子(DOP)与协方差之间的关系 参考链接: [1] evenator. libnmea_navsat_driver/driver.py [EB/OL]. https://gith ...
- python中属性和类级变量_六、Python类变量和实例变量(类属性和实例属性)
我们知道,无论是在类中定义的属性还是方法,在类的外部,都无法直接调用它们,因此,我们完全可以把类看做是一个独立的作用域(称为类命名空间),则类属性其实就是定义在类命名空间内的变量(类方法其实就是定义的 ...
- python变量的赋值操作_Python中关于变量赋值操作的实例分享
这篇文章主要介绍了Python编程之变量赋值操作,结合实例形式分析了Python赋值.位移.多元赋值操作符等相关操作使用技巧,需要的朋友可以参考下 本文实例讲述了Python编程之变量赋值操作.分享给 ...
最新文章
- echarts geo地图示例_用Python,炫酷地图轻松绘制,一起来学习吧
- Spring 中的 bean 为什么默认单例?
- 训练不出结果_工业设计师如何训练自己的设计思维? 问答
- 成大事必备9种能力 9种手段 9种心态(图)
- Lua游戏开发----模块
- 心动网络:PolarDB助力心动网络打造爆款手游
- 手机屏坏了怎么把里面存东西取出来_手机又卡了,到底是运行不够还是存储容量不足?1分钟搞懂...
- BeautifulSoup入门案例
- 程序员必备软技能之科技趋势(一)
- (二)为AI模型训练准备影像
- Java里多个Map的性能比較(TreeMap、HashMap、ConcurrentSkipListMap)
- 26个英语字母表及字母音标
- Contextual Transformer Networks for Visual Recognition
- 在计算机上如何打开资源管理器,资源管理器怎么打开?打开资源管理器的5种方法...
- python七巧板拼图代码_为什么代码都是用英文来写的,将来会有用中文写代码的那天吗?...
- php通过imap获取腾讯企业邮箱信息后的解码处理
- 希望从今往后,是日积月累的努力,而不是由于心血来潮而半途而废
- can是什么时候处于显性_CAN总线什么情况下为空闲状态? - 全文
- python 三色球问题
- (二)向前 向后 中心差商
热门文章
- 当兵的目标和计划_“士兵计划”与我的那些事儿——【初试篇】
- 我的世界java版使用剑_我的世界:JAVA版藏“私货”内置绝世好剑与神功,你玩的版本有吗...
- SYBASE数据导入技巧
- 测试智慧城市项目API接口
- 利用R与NumPy实现矩阵乘法
- 【BZOJ4516】生成魔咒,后缀数组+Splay
- 【BZOJ1901】Dynamic Rankings,树状数组套主席树
- sdoi2017 r1 不堪回首
- mysql删除中继日志_mysql 中继日志删除可以自动获取吗
- 【Level 08】U07 Mixed Feelings L3 I just want to have fun