Python中反射和描述器总结

作者:121502_hl 时间:2022-06-18 09:38:22 

反射

在Python中,能够通过一个对象,找出type、class、attribute或者method的能力,成为反射。

函数与方法

内建函数:

getattr(object,name[,degault])  通过name返回object的属性值,当属性不存在,将使用default返回,如果没有default,则抛出AttributeError。Name必须为字符串。

setattr(object,name,value)  object的属性存在,则覆盖,不存在,新增。

hasattr(object,name)  判断对象是否有这个名字的属性,name必须为字符串

反射相关的魔术方法

__getattr__()

一个类的属性会按照继承关系找,如果找不到,就会执行__getattr__()方法,如果没有这个方法,就会抛出AttributeError异常表示找不到属性。

查找顺序为:

Instance.__dict__-->instance.__class__.__dict__-->继承的祖先类(直到object)的__dict__---找不到--> 调用__getattr__()

__setattr__()

可以拦截对实例属性的增加、修改操作,如果要设置生效,需要自己操作实例的__dict__

__delattr__()

可以阻止通过实例删除属性的操作,但是通过类依然可以删除属性。

__getattribute__()

实例的所有的属性访问,第一个都会调用__getattribute__方法,它阻止了属性的查找,该方法应该返回值或者抛出一个AttributeError异常

它的return值将作为属性查找的结果

如果抛出AttributeError异常,则会直接调用__gutattr__方法,因为表述属性没有找到。

__grtattribute__方法中为了避免在该方法中无限的递归,他的实现应该永远调用基类的同名方法以访问需要的任何属性,例如:object.__getattribute__(self,name)。一般不使用该方法

魔术方法

__getattr__()

当通过搜索实例、实例的类及祖先类查不到属性,就会调用此方法

__setattr__()

通过.访问实例的属性,进行增加,修改都要调用它

__delattr__()

当通过实例来删除属性时调用此方法

__getattribute__()

实例所有的属性调用都从这个方法开始

属性查找顺序:

实例调用__getattribute__() --> Instance.__dict__-->instance.__class__.__dict__-->继承的祖先类(直到object)的__dict__---找不到--> 调用__getattr__() 。

描述器:

描述器定义

在python中,一个类实现了__get__、__set__、__delete__三个方法中的任何一个方法,就是描述器。

如果仅实现了__get__,就是非数据描述符non-data descriptor

同时实现了__get__,__set__就是数据描述符 data descriptor

如果一个类的类属性设置为描述器实例,那么它被称为owner属主

属性查找顺序

实例的__dict__优先于非数据描述器,数据描述器优先于实例的__dict__

有__delete__方法有同样的效果,有了这个方法,也是数据描述器。

描述器在python中应用非常广泛,python的方法(包括staticmethod()和class method())都实现为非数据描述器,因此,实现可以重新定义和覆盖方法。这允许单个实例获取与同一个类的其他实例不同的行为。

Python中property()函数实现为一个数据描述器。

来源:http://blog.51cto.com/1502606/2179050

标签:Python,反射,描述器
0
投稿

猜你喜欢

  • 深度解析MySQL 5.7之中文全文检索

    2024-01-20 22:36:55
  • 基于Python使用永中文档转换服务的方式

    2021-09-29 12:26:12
  • 高效的mysql分页方法及原理

    2024-01-20 04:23:46
  • vue中的ref和$refs的使用

    2024-05-13 09:08:44
  • python 爬取天气网卫星图片

    2022-01-11 15:52:48
  • SQL Server 数据库清除日志的方法

    2024-01-20 20:14:03
  • mysql的日期和时间函数

    2024-01-22 12:46:18
  • Python桌面文件清理脚本分享

    2022-10-11 03:13:23
  • 在Django框架中设置语言偏好的教程

    2022-01-18 22:47:35
  • js实现rem自动匹配计算font-size的示例

    2023-08-22 11:02:33
  • 详解Python3中yield生成器的用法

    2021-09-03 05:59:27
  • Oracle数据库的安全策略

    2010-07-31 13:13:00
  • XMLHTTP错误The server name or address could not be resolved 的解决过程

    2009-12-26 18:33:00
  • 把你的数据库置于版本控制之下

    2009-04-25 10:01:00
  • MySQL Enterprise备份的恢复解决方案

    2011-12-14 18:36:25
  • Python 的矩阵传播机制Broadcasting和矩阵运算

    2021-07-28 01:03:34
  • PHP中SimpleXML函数用法分析

    2023-06-23 11:52:09
  • 数据库访问性能优化

    2024-01-21 18:24:47
  • 一个不错网速测试代码

    2008-07-20 13:41:00
  • tensorflow实现图像的裁剪和填充方法

    2023-07-11 13:26:23
  • asp之家 网络编程 m.aspxhome.com