Python 面向对象之反射

TOC

  • 什么是反射?
  • hasattr
  • getattr
  • setattr
  • delattr
  • 哪些对象可以使用反射
  • 反射的好处
  • 例子一
  • 例子二

什么是反射?

 程序可以访问、检查和修改它本身的状态的行为的一种能力(自省)
python中在面向对象中的反射:通过字符串的形式操作对象相关属性,就是通过字符串让对象自省自检是否有字符串表示的属性。python
反射提供hasattr/getattr/setattr/delattr

hasattr

  • hasattr(obj, 'string') 让obj自省自检有没有和string名符合的属性,有返回True,没有返回False。

getattr

  • getattr(obj, 'string', None) 返回obj和string名相同的绑定方法。可以用来让一个变量引用这个返回结果,后面就可以call这个变量

    ,相当于call对象的绑定方法.如果没有,返回None,没有第三个参数则抛出异常

setattr

  • setattr(obj, 'string', val) obj设置一个和string同名的的属性,并赋值为val。

delattr

  • delattr(obj, 'string') 删除obj对象的‘string’的同名的属性。

哪些对象可以使用反射

  • python中一切都是对象,所以都可以使用反射来进行自省
  • 类可以对类的共有属性,方法(绑定方法,非绑定方法)进行反射
  • 当前模块也可以进行反射。如:判定导入的模块是否有某个方法,有的化就进行调用。

反射的好处

  • 实现可插拔机制。什么意思呢?就是可先判定某个对象(模块对象,类对象,对象等)是否有某个属性(是否插入),有则调用处理。

    没有(拔出)则走另一条逻辑。
  • 这样可以实现团队开发中,实现预定好接口,就算调用的接口没有具体完成,调用方也可以完成自己的逻辑。
  • 动态模块导入:a.import(模块名)函数 b. 使用importlib模块,使用importlib的import_module('模块名')
  • 动态导入模块使用场景:
    • a. 动态引用模块的变量,可以利用反射,切换其引用的模块,并使用模块中的属性。
    • b. 使用反射判断是否有对应属性,有则干嘛,没有则干嘛。 两种场景都是利用对象的反射来处理。核心就是利用字符串来驱动不同的事件,比如导入模块,调用函数等。

      这是一种编程方法,设计模式的提现,凝聚了高内聚、松耦合的编程思想,不能简单的用执行字符串来代替。反射和exec()和eval()不同。

      参考:http://www.cnblogs.com/yooma/p/8004788.html

例子一

class People(object):
def __init__(self, name, age):
self.name = name
self.age = age def speak(self):
print('%s is speaking' % self.name) obj = People('孙悟空', 22)
act = input('悟空:').strip()
if hasattr(obj, act):
getattr(obj, act)()
func1 = getattr(obj, act)
func1()
else:
print('{} can not {}'.format(obj.name, act))

例子二

class BlackMedium(object):
feature = 'Ugly' def __init__(self, name, addr):
self.name = name
self.addr = addr def sell_house(self):
print('%s 黑中介卖房子啦!' % self.name) def rent_house(self):
print('%s 黑中介租房子啦' % self.name) sb = BlackMedium('傻逼', '美帝')
# 判定是否有属性
print(hasattr(sb, 'sell_house'))
print(hasattr(sb, 'rent_house'))
print(hasattr(sb, 'test')) # 获取一个属性,并用一个变量引用,调用变量来执行
func1 = getattr(sb, 'sell_house', None)
func1()
func2 = getattr(sb, 'rent_house')
func2()
# func3 = getattr(sb, 'test')
# func3() # 新增一个属性
setattr(sb, 'age', '100')
print(sb.age)
print(getattr(sb, 'age'))
setattr(sb, 'talk', lambda self: print('来买房呀%s' % self.addr)) # 这个就不是绑定方法了
sb.talk(sb)

Python 面向对象之反射的更多相关文章

  1. Python面向对象之-反射

    Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr  判断是否有改属性或者方法,有返回True,没有返回false getattr  如果是属性获得该属性 ...

  2. python 面向对象之反射及内置方法

    面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...

  3. python面向对象的反射

    python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) getattr # 根据字符串的形式,去对象中找成员.hasattr # 根据字符 ...

  4. Python面向对象之反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  5. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

  6. 第三十四篇 Python面向对象之 反射(自省)

    什么是反射? 反射的概念是由Smith在1982年提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语 ...

  7. Python面向对象之反射

    一.反射的基本概念 二.反射示例 三.反射的应用 一.反射的基本概念 反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python中一切皆对象,都可以使用反射. 反射有 ...

  8. Python 面向对象 (补充) , 反射 , 内置函数

    面向对象中内置函数 issubclass方法: 检查第一个参数是否是第二个参数的子子孙孙类     返回  :   是一个布尔值 class Base(object): pass class Foo( ...

  9. python面向对象之反射和内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

随机推荐

  1. angular学习笔记(三)

    1.安装npm install --save @angular/material@2.0.0-beta.72.安装http://chrome-extension-downloader.com安装aug ...

  2. Python练手例子(14)

    79.字符串排序. #python3.7 if __name__ == '__main__': str1 = input('Input string:\n') str2 = input('Input ...

  3. CUDA编程模型

    1. 典型的CUDA编程包括五个步骤: 分配GPU内存 从CPU内存中拷贝数据到GPU内存中 调用CUDA内核函数来完成指定的任务 将数据从GPU内存中拷贝回CPU内存中 释放GPU内存 *2. 数据 ...

  4. Redis的7个应用场景

    一:缓存——热数据 热点数据(经常会被查询,但是不经常被修改或者删除的数据),首选是使用redis缓存,毕竟强大到冒泡的QPS和极强的稳定性不是所有类似工具都有的,而且相比于memcached还提供了 ...

  5. 深入理解JVM垃圾收集机制,下次面试你准备好了吗

    程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收.垃圾回收主要是针对 Java 堆和方法区进行. 判断一个对 ...

  6. FFmpeg 结构体学习(二): AVStream 分析

    在上文FFmpeg 结构体学习(一): AVFormatContext 分析我们学习了AVFormatContext结构体的相关内容.本文,我们将讲述一下AVStream. AVStream是存储每一 ...

  7. 破解第一课:NOP绕过登录界面

    第一步 打开软件,任意输入密码,提示“用户密码错误还有2次机会” 第二步 OD载入软件,右键-----中文搜索引擎---智能搜索 按下CTRL+F,打开查找,输入“密码错误”,在结果中双击找到的结果 ...

  8. Java9发布回顾Java 8的十大新特性

    java9已经在北京时间9月22日正式发布,开发者可以在oracle jdk官网上下载到最新的jdk9. 今天,我们先来一起复习一下2014年发布的Java 8的十大新特性.先来喝杯java~~~ 按 ...

  9. Python内置函数(49)——pow

    英文文档: pow(x, y[, z]) Return x to the power y; if z is present, return x to the power y, modulo z (co ...

  10. 【JVM虚拟机】(2)---GC 算法与种类

    GC 算法与种类 对于垃圾收集(GC), 我们需要考虑三件事情:哪些内存需要回收?如何判断是垃圾对象?垃圾回收算法有哪些? 一.GC的工作区域 1.不是GC的工作区域 (1)程序计数器.虚拟机栈和本地 ...