属性查找顺序

关于属性描述符请看上文>属性描述符

  在梳理属性查找相关知识时,查看了很多的书籍和他人的博客,发现很多讲的过于抽象,并没有一个清晰的流程呈现。特此写下我对于此方面的理解和总结。

我将属性的查找拆分为三种情形,分别为普通属性查找、数据描述符查找,非数据描述符查找。

普通属性的查找

  • Normal.py
class MyAttr():
name = 'class_levy'
def __init__(self):
self.name = "instance_levy"
def __getattribute__(self, item):
return "This is getattribute"
def __getattr__(self, item):
return "This is getattr" my = MyAttr()
print(my.name)
  • 我通过上述的代码,一步步的调试,将步骤呈现给读者。当前的输出结果是“This is getattribute"
  • 将当前代码中如下的片段注释后,输出结果为"instance_levy"
    #def __getattribute__(self, item):
#return "This is getattribute"
  • 接下来将__init(self)重写如下,输出内容为"class_levy"
    def __init__(self):
pass
  • 最后将类属性注释,输出内容为"This is getattr"

  从上述的流程,我们可以分析出普通属性的查找过程为__getattribute__()->实例属性->类属性->getattr

数据描述符的查找

  • DataDes.py
class Data():
def __get__(self, instance, owner):
return "This is get"
def __set__(self, instance, value):
pass class MyAttr():
name = Data()
def __init__(self):
self.name = "instance_levy"
def __getattribute__(self, item):
return "This is getattribute"
def __getattr__(self, item):
return "This is getattr" my = MyAttr()
print(my.name)

  同上所述的分析方法,我们可以得出查找顺序__getattribute__()->描述符__get__()->实例属性->getattr

非数据描述符的查找

  • NotdataDes.py
class NoneData():
def __get__(self, instance, owner):
return "This is get" class MyAttr():
name = NoneData()
def __init__(self):
self.name = "instance_levy"
def __getattribute__(self, item):
return "This is getattribute"
def __getattr__(self, item):
return "This is getattr" my = MyAttr()
print(my.name)

  同上所述的分析方法,我们可以得出查找顺序__getattribute__()->实例属性->描述符__get__()->getattr

流程图

  以下为三种情况下的流程图,为了理解更容易我将三种情况分别讲述,在大部分的流程讲解中是不为三种情况分别叙述的,容易造成复杂混乱的感觉。

最新文章

  1. Oracle基础维护01-常用管理命令总结
  2. iOS简单实现毛玻璃效果
  3. 【前端】Web前端学习笔记【1】
  4. [3D跑酷] DataManager
  5. WPF 多线程处理(5)
  6. POJ 2002 Squares 哈希
  7. eclipse 一些快捷键
  8. HDU 3127 WHUgirls
  9. JQuery UI 封装了一些常用模板
  10. 关于小程序swiper不显示图的那些事
  11. 登陆 全站 user
  12. Selenium WebDriver Api 知识梳理
  13. 《GPU高性能编程CUDA实战》第三章 CUDA设备相关
  14. Kafka 温故(四):Kafka的安装
  15. python元组()小括号
  16. Linux 环境部署记录(一) - 基础设定
  17. 用Jquery获取checkbox多个选项
  18. SQL Serever学习9——基础查询语句
  19. 从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社
  20. The 15th UESTC Programming Contest Preliminary B - B0n0 Path cdoj1559

热门文章

  1. 【批处理】choice命令,call 命令,start 命令,rem
  2. 洛谷 题解 P2731 【骑马修栅栏 Riding the Fences】
  3. html转为图片插件:html2canvas保存图片模糊问题解决
  4. 一个100%Go语言的Web-Term-SSH 堡垒机项目
  5. ES6 数组方法 forEach map filter find every some reduce
  6. JavaScript中的内存溢出与内存泄漏
  7. java生成HMACSHA256的方法
  8. hypermesh对msh文件或者cas文件重新命名边界
  9. Hive(一)—— 启动与基本使用
  10. modao账户