Python中反射和描述器总结

 更新时间:2018年09月23日 14:58:00   作者:121502_hl  
这篇文章主要介绍了Python中的反射和描述器一些知识的汇总,非常的详细,有需要的小伙伴可以参考下

反射

在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()函数实现为一个数据描述器。

相关文章

  • Python中怎样查找文件当前位置

    Python中怎样查找文件当前位置

    这篇文章主要介绍了Python中怎样查找文件当前位置的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • python实现问号表达式(?)的方法

    python实现问号表达式(?)的方法

    这篇文章主要介绍了python实现问号(?)表达式的方法,大家参考使用吧
    2013-11-11
  • pandas修改DataFrame列名的实现方法

    pandas修改DataFrame列名的实现方法

    这篇文章主要介绍了pandas修改DataFrame列名的实现方法, 文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Python利用 SVM 算法实现识别手写数字

    Python利用 SVM 算法实现识别手写数字

    支持向量机 (Support Vector Machine, SVM) 是一种监督学习技术,它通过根据指定的类对训练数据进行最佳分离,从而在高维空间中构建一个或一组超平面。本文将介绍通过SVM算法实现手写数字的识别,需要的可以了解一下
    2021-12-12
  • Python多线程学习资料

    Python多线程学习资料

    Python中使用线程有两种方式:函数或者用类来包装线程对象
    2012-12-12
  • python机器学习实战之最近邻kNN分类器

    python机器学习实战之最近邻kNN分类器

    这篇文章主要介绍了python机器学习实战之最近邻kNN分类器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Python+Delorean实现时间格式智能转换

    Python+Delorean实现时间格式智能转换

    DeLorean是一个Python的第三方模块,基于 pytz 和 dateutil 开发,用于处理Python中日期时间的格式转换。本文将详细讲讲DeLorean的使用,感兴趣的可以了解一下
    2022-04-04
  • python跨文件使用全局变量的实现

    python跨文件使用全局变量的实现

    本文主要介绍了python跨文件使用全局变量的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • dataframe设置两个条件取值的实例

    dataframe设置两个条件取值的实例

    下面小编就为大家分享一篇dataframe设置两个条件取值的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 如何用python整理附件

    如何用python整理附件

    本篇文章给大家整理了关于如何用python整理附件的相关知识点,学习python的朋友可以跟着测试下。
    2018-05-05

最新评论