反射是指通过字符串映射或修改程序运行时的状态、属性、方法, 有以下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. 定义一个Map集合,key和value不规定类型,任意放入数据,用keySet()和 entrySet()两种方式遍历出Map集合的数据

    package com.lanxi.demo1_1_1; import java.util.HashMap; import java.util.Iterator; import java.util.M ...

  2. 用 LSTM 做时间序列预测的一个小例子(转自简书)

    问题:航班乘客预测 数据:1949 到 1960 一共 12 年,每年 12 个月的数据,一共 144 个数据,单位是 1000 下载地址 目标:预测国际航班未来 1 个月的乘客数 import nu ...

  3. Markdown中特殊字符的转义字符

    上次在用Markdown记笔记时,当正文中写到<PROJECT>_<PATH>_<FILE>_H_时,<>里的内容显示显示不出来,就算用' '也显示不出 ...

  4. 释放jQuery 的$ 的使用权

    1.释放操作必须在编写其他jquery 代码之前编写,释放之后就不能使用$,改为jQuery . jQuery.noConflict();   2.也可以自定义访问符号   var nb = jQue ...

  5. Qt笔记之QGADGET

    QGADGET宏类似于Q_OBJECT宏,是一个万能容器,至于这个宏所实现的功能,我也不懂,Q_OBJECT宏的功能到时了解一些,我想他们应该差不多,要想使用从Q_OBJECT继承来的类,就得在一开始 ...

  6. Flutter 卡在 package get 的解决办法

    今天在尝试使用Flutter 的时候,需要使用一个第三方库 修改了 pubspec 文件之后,AS 像往常一样提示 需要 package get. 之前都挺正常,不知道今天怎么了. 一直处在 Runn ...

  7. EOJ Monthly 2019.2 题解(B、D、F)

    EOJ Monthly 2019.2 题解(B.D.F) 官方题解:https://acm.ecnu.edu.cn/blog/entry/320/ B. 解题 单测试点时限: 2.0 秒 内存限制:  ...

  8. Springboot读取本地图片并显示

    在application.yml中配置url访问路径和本地图片路径: 方框1:url中访问路径,这里为:localhost:8080/testspringboot/image/... 方框2:本地图片 ...

  9. windows下postgreSQL安装与启动

    转:https://www.yiibai.com/postgresql/install-postgresql.html https://blog.csdn.net/irainreally/articl ...

  10. cocoa-charts 导入其依赖库TABlib 报UIKit Foundation找不到的问题

    对于应用到项目中的一些第三方类库,尤其是C/C++ 写的,里面的大部分类文件的后缀都是 .C. 解决办法: 在 build setting 里按照如图所示,进行设置: 这说明以后只要是第三方类库中使用 ...