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中表示字符串的三种方法
Sep 06 Python
python学习教程之使用py2exe打包
Sep 24 Python
pandas series序列转化为星期几的实例
Apr 11 Python
python获取当前目录路径和上级路径的实例
Apr 26 Python
python 从csv读数据到mysql的实例
Jun 21 Python
对python的bytes类型数据split分割切片方法
Dec 04 Python
详解如何减少python内存的消耗
Aug 09 Python
python 类之间的参数传递方式
Dec 20 Python
Python:type、object、class与内置类型实例
Dec 25 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 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创建动态图像
2006/10/09 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
js跨域和ajax 跨域问题的实现思路
2009/09/05 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
JS快速实现移动端拼图游戏
2016/09/05 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
python使用socket向客户端发送数据的方法
2015/04/29 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
python操作yaml说明
2020/04/08 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
职业生涯规划书基本格式
2014/01/06 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
优秀求职信范文分享
2014/01/26 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
2015年底工作总结范文
2015/05/15 职场文书
永远是春天观后感
2015/06/12 职场文书
学校财务管理制度
2015/08/04 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js