Python 反射

概述

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

反射相关的函数和方法

这种动态增删属性的方式是运行时改变类或者实例的方式,但是装饰器或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 方法用来做什么,否则不要使用它。

推荐阅读更多精彩内容

  • 有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的某个字段赋值,而方法名或是字段名在编码代码时并...
    Chenzongshu阅读 1,336评论 0 48
  • 1.反射自省的概念 自省:自省就是能够获得自身的结构和方法,给开发者可以灵活的调用,给定一个对象,返回该对象的所有...
    XYZeroing阅读 2,183评论 0 2
  • 转自:http://www.cnblogs.com/feixuelove1009/p/5576206.html,只...
    think_lonely阅读 2,206评论 1 2
  • Ubuntu 16.04 安装jdk 准备工作 安装版本:jdk-8u91-linux-x64.tar.gz 官方...
    帷幄庸者阅读 8,371评论 3 7
  • 春风却萧瑟,红黄的落叶打在我的风衣上,一片、一片;我站在江边树下,极目望去,江中的海子已经愈游愈远,直到消失在水天...
    朱大饼阅读 98评论 1 1
  • 问题的提出 在计算机科学领域,分布式一致性是一个相当重要且被广泛探索与论证问题,首先来看三种业务场景。 1、火车站...
    自度_3495阅读 842评论 0 2
  • 1997年,距离路遥去世已经5年,距离《平凡的世界》第一次出版已经11年,我13岁。 暑假某一天,一个下着雨的清晨...
    老末子阅读 433评论 4 3
  • 百度网盘里边一大堆音频,碎片时间想用手机或者平板听一下,结果它提示你:先下载。 下载? 下载完,黄花菜都凉了,手都...
    VeraLi阅读 6,684评论 0 2