标签:关系 利用 本质 elf 异常 自己 查看 callable point
反射refletion:指的是运行时获取类型定义信息
运行时,区别在于编译时,指的是程序被加载到内存中执行的时候
简单的说,在python中,能够通过一个对象,找出其type,class,attribute或method的能力,称为反射或者自省
具有反射能力的函数有:type(),isinstance(),callable(),dir(),getattr()
例:有一个Point类,查看它实例的属性,并修改它,动态为实例增加属性
上例通过属性字典__dict__来访问对象的属性,对属性进行修改或者增加新的属性,本质上也是利用的反射的能力,但是这种访问方式不优雅,python提供了内置的函数
反射相关的魔术方法:__getattr__、__setattr__、__delattr__
一个类的属性会按照继承关系找,如果找不到,就会执行__getattr__()方法,如果没有这个方法,就会抛出AttributeError异常表示找不到属性
__serattr__()方法,可以拦截对实例属性的增加、修改操作,如果要设置生效,需要自己操作实例的__dict__.
__getattribute__:
实例的所有的属性的访问,第一个都会调用__getattribute__方法,它阻止了属性的查找,该方法应该返回(计算后的)值或者抛出一个AttributeError异常,它的return值将作为属性查找的结果,如果抛出AttributeError异常,则会直接调用__getattr__方法,因为表示属性没有找到
__getattribute__方法中为了避免在该方法中无限的递归,它的实现应该永远调用基类的同名方法以访问需要的任何属性,例如object.__getattribute__(self,name)
除非明确知道__getattribute__方法用来做什么,否则不要使用它
标签:关系 利用 本质 elf 异常 自己 查看 callable point
原文地址:https://www.cnblogs.com/s-p-l/p/10259471.html