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之玩转字符串(1)
Sep 14 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
详解python中xlrd包的安装与处理Excel表格
Dec 16 Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 Python
python 多进程队列数据处理详解
Dec 23 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
Pytest测试框架基本使用方法详解
Nov 25 Python
写一个Python脚本自动爬取Bilibili小视频
Apr 24 Python
基于Python实现将列表数据生成折线图
Mar 23 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 session_start()问题解疑(详细介绍)
2013/07/05 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
Javascript 模式实例 观察者模式
2009/10/24 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
js prototype和__proto__的关系是什么
2019/08/23 Javascript
pygame学习笔记(5):游戏精灵
2015/04/15 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
python对csv文件追加写入列的方法
2019/08/01 Python
python3 求约数的实例
2019/12/05 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
制药工程专业职业生涯规划范文
2014/03/10 职场文书
家具商场的活动方案
2014/08/16 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
离婚协议书怎么写
2014/09/12 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
初婚初育证明范本
2014/11/24 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
python内置模块之上下文管理contextlib
2022/06/14 Python