Python 反射

概述

运行时,区别于编译时,指的是程序被加载到内存中执行的时候。
反射,reflection,指的是运行时获取类型定义信息。
一个对象能够在运行时,像照镜子一样,反射出其类型信息。
简单说,在Python中,能够通过一个对象,找出其type、class、attribute或method的能力,称为反射或者自省。
具有反射能力的函数有:type()、isinstance()、callable()、dir()、getattr()

反射相关的函数和方法

Python 反射_第1张图片

这种动态增删属性的方式是运行时改变类或者实例的方式,但是装饰器或Mixin都是定义时就决定了,因此反射能力具有更大的灵活性。

反射相关的魔术方法

_getattr_()
一个类的属性会按照继承关系找,如果找不到,就会执行 getattr() 方法,如果没有这个方法,就会抛出AttributeError异常表示找不到属性。
查找属性顺序为:
instance.dict --> instance.class.dict --> 继承的祖先类(直到object)的dict ---找不到--> 调用getattr()

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

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

_getattribute_()
实例的所有的属性访问,第一个都会调用 getattribute 方法,它阻止了属性的查找,该方法应该返回(计算 后的)值或者抛出一个AttributeError异常。
它的return值将作为属性查找的结果。
如果抛出AttributeError异常,则会直接调用 getattr 方法,因为表示属性没有找到。

_getattribute_ 方法中为了避免在该方法中无限的递归,它的实现应该永远调用基类的同名方法以访问需要的任何属性,例如 object.getattribute(self, name) 。
注意,除非你明确地知道 getattribute 方法用来做什么,否则不要使用它。

你可能感兴趣的:(Python 反射)