Python属性的查找顺序
属性查找顺序
关于属性描述符请看上文>属性描述符
在梳理属性查找相关知识时,查看了很多的书籍和他人的博客,发现很多讲的过于抽象,并没有一个清晰的流程呈现。特此写下我对于此方面的理解和总结。
我将属性的查找拆分为三种情形,分别为普通属性查找、数据描述符查找,非数据描述符查找。
普通属性的查找
- 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.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- 类和实例属性的查找顺序 mro查找
如果多个类继承父类,然后又被多个类继承这种复杂的问题,可以使用 mro方法 例如: class A: pass class C(D): pass class B(D): pass class A(B, ...
- python属性查找(attribute lookup)
在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候. 在上一文章末尾,给出了一段代码,就涉及到descriptor与att ...
- day 24 面向对象之继承及属性查找顺序
组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def init(self, name, age): self.name = name self.age = age t1 ...
- python属性查找 深入理解(attribute lookup)
在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候. 在上一文章末尾,给出了一段代码,就涉及到descriptor与attribu ...
- Python 属性描述符和属性的查找过程
属性描述符可以用来控制给属性赋值的时候的一些行为 import numbers class IntField: def __get__(self, instance, owner): return s ...
- python基础语法20 面向对象5 exec内置函数的补充,元类,属性查找顺序
exec内置函数的补充 exec: 是一个python内置函数,可以将字符串的代码添加到名称空间中; - 全局名称空间 - 局部名称空间 exec(字符串形式的代码, 全局名称空间, 局部名称空间) ...
- Python函数作用域的查找顺序
函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...
- python—命名空间、作用域查找顺序、闭包
名称空间 name space,如下图: x = 1, 1存放在内存中,1 会有一个内存地址,x 则 存放在 name space 里,并同时记录了 1的内存地址, 即 名称空间是存放了变量x与1绑定 ...
随机推荐
- 微信浏览器中清缓存的方法---- http://debugx5.qq.com/
http://debugx5.qq.com/ 点击上面网址,然后把底部的四个选项打钩,然后点清除,即可把可恶的缓存清掉!!!!!
- 2019.12.10 break 标记
class Demo01{ public static void main(String[] args) { int i=0; a:for(i=0;i<3;i++){ for(int j=0;j ...
- 又一款dump文件观察工具---MiniDumpView
简介 MiniDumpView实用程序可用于显示minidump中数据流的内容.特别是,可以显示以下信息: 操作系统和CPU信息 进程信息(进程ID和时间) 模块列表(包含每个模块的详细信息) 线程列 ...
- win7企业版激活
win7企业版激活:(亲测有效) 打开命令提示符,依次执行下面的代码,分别表示:安装win7企业版密钥,设置kms服务器,激活win7企业版,查询激活期限,kms一般是180天,到期后再次激活. sl ...
- Ubuntu系统之Hadoop搭建
作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3223 一.在Window中安装Oracle VM VirtualBox 二 ...
- pycharm 当有多个.py文件在开发环境中时,如何操作可以保证运行当前面对自己的文件?
Alt+shift+F10选择自己的py文件,执行就可以了.
- Cesium的Property机制总结[转]
https://www.jianshu.com/p/f0b47997224c 前言 Cesium官方教程中有一篇叫<空间数据可视化>(Visualizing Spatial Data).该 ...
- Nginx简单配置几个基于端口的虚拟主机
nginx.conf中,一个server段对应一个虚拟主机,如果要增加多个虚拟主机,增加多个server段即可. server { listen ; access_log logs/.log; loc ...
- Xamarin图表开发基础教程(7)OxyPlot框架
Xamarin图表开发基础教程(7)OxyPlot框架 Xamarin.Forms中使用OxyPlot框架 在Xamarin. Forms平台上实现图表显示需要完成以下的步骤: 1.添加OxyPlot ...
- python开发--列表当全局变量来使用
python中,申明全局变量的时候,一般该变量类型基本上是:字符串或数字: 比较少用“列表”当做变量, 当有作用域限制的情况下,想要外部调用内部作用域的“列表”变量时,可以用这种方式,外部申明一个空列 ...