Python类和实例的属性机制原理详解


Posted in Python onMarch 21, 2020

实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性。

实例1:

class A:
  work = list("hello")
  kind = list("world")
  another = 1

  def test1(self):
    print(self.work, self.kind, self.another)
    self.work[0], self.kind [0] = "t", "t"
    self.another += 1
    print(A.work, A.kind, A.another)
if __name__ == "__main__":
  a = A()
  a.test1()

输出结果:

['h', 'e', 'l', 'l', 'o'] ['w', 'o', 'r', 'l', 'd'] 1
['t', 'e', 'l', 'l', 'o'] ['t', 'o', 'r', 'l', 'd'] 1

test1中演示了实例对类变量的访问与修改,从输出结果可以看到,类变量work和kind的列表被修改了,而another的值没有发生变化,说明如果类变量是可变的,那么可以通过实例来对类变量进行修改,如果类变量不可变,那么实例无法修改类变量。

实例2:

class A:
  work = list("hello")
  kind = list("world")
  another = 1

  def test2(self):
    A.work, A.kind = "hello", " world"
    A.another += 2
    print(self.__dict__)
    print(self.work, self.kind, self.another)
    A.test2 = 13
    print(self.test2)
if __name__ == "__main__":
  a = A()
  a.test2()

输出结果:

 {'another': 2}
 hello world 2
 13

test2说明了实例访问类变量与方法的机制,在test1中,已经给实例动态绑定了一个another的属性,值为2(因为有赋值语句)。在self.__dict__中可以看到确实出现了实例属性another。

在使用实例访问属性(变量与方法)时,如果在实例的属性集里没有找到对应的属性,那么就会到类的属性集里找对应的属性。self.work和self.kind和类变量保持一致,说明并没有事先在实例与类变量之间建立引用,而是动态查找的。

class A:
  work = list("hello")
  kind = list("world")
  another = 1

  def test3(self):
    print(self.__dict__)
    self.w, self.k = 0, 1
    print(self.__dict__)
    self.work, self.kind = 4, 4
    print(self.__dict__)
    self.test1 = 12
    print(self.__dict__)
    try:
      self.test1()
    except:
      print("test1 is not a bound method")
if __name__ == "__main__":
  a = A()
  a.test3()

输出结果:

 {'another': 2}
 {'another': 2, 'w': 0, 'k': 1}
 {'another': 2, 'w': 0, 'k': 1, 'work': 4, 'kind': 4}
 {'another': 2, 'w': 0, 'k': 1, 'work': 4, 'kind': 4, 'test1': 12}
 test1 is not a bound method

self.__dict__中保存了动态绑定到实例的变量与方法,只要出现了赋值语句,都是动态绑定属性。如果动态绑定的属性与类的变量或方法同名,在查找过程中就会覆盖类的变量和方法。

总结

1. 动态绑定到实例的属性位于self.__dict__中

2. 出现self.attribute = XXX之类的赋值语句都是在往实例上动态绑定属性

3. 实例查找属性的流程:self.work -> self.__dict__["work"] or cls.work,这是一个动态的过程,实例中的同名属性会覆盖类变量或方法,类变量或方法的修改会实时影响实例查找属性的结果

4. 如果类变量是可修改的,如列表,字典等,可以通过实例来修改类变量,方法是不可修改的,故无法通过实例修改方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
基于Python实现对PDF文件的OCR识别
Aug 05 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
Sep 05 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
基于python3实现socket文件传输和校验
Jul 28 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
解决python有时候import不了当前的包问题
Aug 28 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
Python进阶之迭代器与迭代器切片教程
Jan 29 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
Python列表解析操作实例总结
Feb 26 Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 Python
基于Python实现对比Exce的工具
Apr 07 Python
Python生成器常见问题及解决方案
Mar 21 #Python
Python作用域与名字空间原理详解
Mar 21 #Python
Python小整数对象池和字符串intern实例解析
Mar 21 #Python
Python描述符descriptor使用原理解析
Mar 21 #Python
Python如何省略括号方法详解
Mar 21 #Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 #Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 #Python
You might like
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
JTrackBar水平拖动效果
2007/07/15 Javascript
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
2013/06/12 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
2020/07/19 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
使用Python实现一个简单的项目监控
2015/03/31 Python
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
详解如何使用Python编写vim插件
2017/11/28 Python
python实现弹窗祝福效果
2019/04/07 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
Windows 下python3.8环境安装教程图文详解
2020/03/11 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
python打包生成so文件的实现
2020/10/30 Python
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
自荐书范文范例
2014/02/13 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
房产公证书
2015/01/23 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python