反射是指通过字符串映射或修改程序运行时的状态、属性、方法, 有以下4个方法

1.getattr(object, name, default = None)

根据字符串获取 obj 对象里对应 str 方法的内存地址

示例:

class Dog(object):
def __init__(self, name):
self.name = name def eat(self, food):
print('%s is eating %s' % (self.name, food)) dog1 = Dog('Dog1')
choice = input('>>').strip()
if hasattr(dog1, choice):
getattr(dog1, choice)('bone') # 根据字符串获取对象里对应方法的内存地址,传入‘bone’执行
print(getattr(dog1, choice)) # 打印属性

输出结果:

>>eat

Dog1 is eating bone

<bound method Dog.eat of <__main__.Dog object at 0x00000249C4C3B780>>

2.hasattr(object, name)

判断一个 obj 对象里是否有对应 str 字符串

示例:

class Dog(object):
def __init__(self, name):
self.name = name def eat(self, food):
print('%s is eating %s' % (self.name, food)) dog1 = Dog('Dog1')
choice = input('>>').strip()
print(hasattr(dog1, choice)) # 判断一个 obj 对象里是否有对应 str 字符串

输出结果:

>>eat

True

3.setattr(object, y, v)

给类新加了一个属性等于: obj.y = v

传入属性示例:

class Dog(object):
def __init__(self, name):
self.name = name def eat(self, food):
print('%s is eating %s' % (self.name, food)) dog1 = Dog('Dog1')
choice = input('>>').strip()
print(hasattr(dog1, choice)) # 判断一个 obj 对象里是否有对应 str 字符串
if hasattr(dog1, choice):
print(getattr(dog1, choice)) # 打印修改前的属性
setattr(dog1, choice, 'Dog2') # 如果属性存在,可以通过 setattr 进行修改
print(getattr(dog1, choice)) # 打印修改后的属性
else:
setattr(dog1, choice, None) # 给类新加了一个属性 == dog1.choice = None
print(getattr(dog1, choice)) # 打印新加入的属性

修改已有属性输出结果:

>>name

True

Dog1

Dog2

增加新的属性输出结果:

>>age

False

None

传入方法示例:

class Dog(object):
def __init__(self, name):
self.name = name def eat(self, food):
print('%s is eating %s' % (self.name, food)) def bulk(self): # 传入方法需要提前写好
print('%s: woof,woof!' % self.name) dog1 = Dog('Dog1')
choice = input('>>').strip()
print(hasattr(dog1, choice)) # 判断一个 obj 对象里是否有对应 str 字符串
if hasattr(dog1, choice):
pass
else:
setattr(dog1, choice, bulk) # 给类新加了一个方法
dog1.bulk(dog1) # 调用新加入的方法 bulk

输出结果:

>>bulk

False

Dog1: woof,woof!

4.delattr(object, name)

删除 obj 对象中对应属性

示例:

class Dog(object):
def __init__(self, name):
self.name = name def eat(self, food):
print('%s is eating %s' % (self.name, food)) dog1 = Dog('Dog1')
choice = input('>>').strip()
print(hasattr(dog1, choice)) # 输出 True
if hasattr(dog1, choice):
delattr(dog1, choice)
print(getattr(dog1, choice)) # 打印会报错

Python 反射(reflection)的更多相关文章

  1. python 反射

    python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! 反射的四个基本函数使用 hasattr,getattr,setatt ...

  2. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  3. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  4. python反射

    python反射 python的反射是基于字符串的形式去对象(模块)中操作其成员.此操作是动态的,常用于web开发中url参数中对应模块或者函数的反射. 下面开始具体说明: 场景需求: 我的pytho ...

  5. [整理]C#反射(Reflection)详解

    本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...

  6. CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)

    CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...

  7. 代理(Proxy)和反射(Reflection)

    前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...

  8. Python反射机制理解

    Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员. getattr(object, name) object代表模块,name代表模块中的属性或成员,该函 ...

  9. Golang 反射reflection

    反射reflection 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地 反射使用TypeOf和ValueOf函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字 ...

随机推荐

  1. SpringMVC详细学习笔记

    Spring MVC   1 spring MVC简介:   Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构 ...

  2. 让虚拟环境解决python多版本并行

    一.安装篇 1.本文操作系统为CentOS7 依赖包(安装时可能还存在其他依赖包,结合报错进行安装) [root@Corre home]# yum install make build-essenti ...

  3. Spring源码学习(7)——AOP

    我们知道,使用面对对象编程的时候有一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时,例如日志.安全检测等,所以就有了一个对面对对象编程的补充,即面对切面编程(AOP),AOP所关注的方向 ...

  4. EditPlus软件自动补全文档htmlbar.acp设置 及 模板文件格式

    1.在htmlbar.acp文件末尾添加如下内容,可自动补全: #T=HTML <html>    ^! </html>   #T=HEAD <head>    ^ ...

  5. 应届生第一次Java面试问题分享

    1.  Java四大域 ServletContext域(Application域): 整个WEB应用 HttpSession域(Session域):一次会话 ServletRequest域(Reque ...

  6. div不固定高度垂直居中

    父容器的css属性 display:table;overflow:hidden;子容器的css属性 vertical-align:middle;display:table-cell; <!DOC ...

  7. CSS效果:跑马灯按钮

    HTML代码 <html lang="en"> <head> <meta charset="UTF-8"> <meta ...

  8. dom树渲染对性能的影响

    这样写会访问两次dom节点树,一次读取innerHTML,一次重写innerHTML. 当然,加载速度也是很惊人的. 用一个变量把a存起来,只读取和重写innerHTML一次. 可以看到加载时间大幅度 ...

  9. Docker 部署应用过程记录

    Kibana直接部署到centos中,老是没有任何征兆退出,今天将他移动到docker中部署,以下是部署的过程,做个记录防止忘记 1.安装Docker # yum install docker 2.启 ...

  10. Jenkins-client模式配置

    Jenkins配置master-slave模式 本来想着先写一篇jenkins安装的流程,但是现在jenkins做的已经非常完善了,有.war文件,直接在tomcat启动即可,所以这里就不多说了,小白 ...