属性查找顺序

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

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

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

普通属性的查找

  • 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

流程图

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

Python属性的查找顺序的更多相关文章

  1. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  2. 类和实例属性的查找顺序 mro查找

    如果多个类继承父类,然后又被多个类继承这种复杂的问题,可以使用 mro方法 例如: class A: pass class C(D): pass class B(D): pass class A(B, ...

  3. python属性查找(attribute lookup)

    在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候.     在上一文章末尾,给出了一段代码,就涉及到descriptor与att ...

  4. day 24 面向对象之继承及属性查找顺序

    组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def init(self, name, age): self.name = name self.age = age t1 ...

  5. python属性查找 深入理解(attribute lookup)

    在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候. 在上一文章末尾,给出了一段代码,就涉及到descriptor与attribu ...

  6. Python 属性描述符和属性的查找过程

    属性描述符可以用来控制给属性赋值的时候的一些行为 import numbers class IntField: def __get__(self, instance, owner): return s ...

  7. python基础语法20 面向对象5 exec内置函数的补充,元类,属性查找顺序

    exec内置函数的补充 exec: 是一个python内置函数,可以将字符串的代码添加到名称空间中; - 全局名称空间 - 局部名称空间 exec(字符串形式的代码, 全局名称空间, 局部名称空间) ...

  8. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  9. python—命名空间、作用域查找顺序、闭包

    名称空间 name space,如下图: x = 1, 1存放在内存中,1 会有一个内存地址,x 则 存放在 name space 里,并同时记录了 1的内存地址, 即 名称空间是存放了变量x与1绑定 ...

随机推荐

  1. AGC028 E - High Elements

    AGC028 E - High Elements 有一个排列\(p\),你要分成两个子序列\(A,B\),满足\(A,B\)的LIS长度相等.设\(S\)是一个\(01\)序列,\(S_i=0\)当且 ...

  2. [golang]Golang实现高并发的调度模型---MPG模式

    Golang实现高并发的调度模型---MPG模式 传统的并发形式:多线程共享内存,这也是Java.C#或者C++等语言中的多线程开发的常规方法,其实golang语言也支持这种传统模式,另外一种是Go语 ...

  3. linux 关闭主板上的蜂鸣器声音

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/mainboard_speaker_close 在从deepin的 ...

  4. Idea 编译项目异常 Error:java: Compilation failed: internal java compiler error

  5. 第09组 团队Git现场编程实战

    组长博客链接 1.团队分工 团队成员 分工明细 王耀鑫 博客撰写,数据处理 陈志荣 前端界面,前端功能实现 陈超颖 前端界面,前端功能实现 沈梓耀 前端界面,前端功能实现 林明镇 数据处理 滕佳 前端 ...

  6. [总结] MSF攻击数据库服务

    0x01 攻击Mysql服务 1.1 目标探测 auxiliary/scanner/mysql/mysql_version 常用于内网中的批量mysql主机发现: 1.2 爆破登录 auxiliary ...

  7. app内嵌H5的上传图片的功能

    1.上传组件 <!-- - hasBorder {Boolean} cell底部边框,oneline 为 true 有效 - inlineBorder {Boolean} cell底部短边框 - ...

  8. 团队作业-Beta冲刺(1/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  9. odoo开发笔记--ValueError Expected singleton

    异常处理参考:https://stackoverflow.com/questions/31070640/valueerror-expected-singleton-odoo8 报错: ValueErr ...

  10. 同时购入两台同款thinkpad笔记本电脑,分别使用同一账户激活office失败--------------解决方法(账户下有多个Office激活信息,重装后提示“许可证不正确或者最大激活次数”)

    如题所述,该问题曾多次与京东商城售后,京东thinkpad品牌售后,thinkpad售后等进行沟通,最后通过微软的电话激活才成功,不过在之后发现了这么一个帖子,应该是官方给出的,应该合理,没有实际验证 ...