python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,该四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

hasattr(obj,name_str):判断一个对象obj里是否有name_str字符串对应的的方法或者属性
getattr(obj,name_str):相当于obj.name_str,根据字符串去获取obj对象里对应的方法的内存地址或对应属性的值
setattr(x, 'y', v) :相当于``x.y = v'',即通过字符串设置新的属性或方法
delattr(x, 'y'):相当于``del x.y'',删除对象obj里y字符串对应的属性

class Foo(object):

    def __init__(self):
self.name = 'wupeiqi' def func(self):
return 'func' obj = Foo() # #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func') # #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func') # #### 设置成员 ####
setattr(obj, 'age', 18)
setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 ####
delattr(obj, 'name')
delattr(obj, 'func')

反射代码示例1

反射代码示例2:

#Author:Zheng Na

def bulk(self): #外部方法
print("%s is yelling..." % self.name) class Dog(object):
def __init__(self,name,age):
self.name = name
self.age = age def eat(self):
print("%s is eating..." %self.name) d = Dog("小黄",1)
choice = input("请输入属性或方法>>:").strip() if choice == "name":
# 判断对象中是否有字符串对应的属性
print(hasattr(d,choice)) # true # 根据字符串去对象中获取对应属性的值
attr = getattr(d,choice)
print(attr) # 小黄 # 修改对象中字符串对应属性的值
setattr(d,choice,"小白")
print(d.name) # 小白 # 删除对象中字符串对应的属性
delattr(d,choice)
print(d.name) # 报错:AttributeError: 'Dog' object has no attribute 'name' elif choice == "eat":
# 判断对象中是否有字符串对应的方法
print(hasattr(d, choice)) # true # 据字符串去获取obj对象里对应的方法的内存地址,然后调用这个方法
func = getattr(d,choice)
func() # 小黄 is eating... # 方法不能删除?还是我的用法有错?
# delattr(d, choice) # 报错:AttributeError: eat elif choice == "talk":
# 通过字符串设置新的方法,可动态地将一个外部的方法装配到类里
# bulk现在相当于一个变量名,你现在用talk来代替了
# 1.方法写死
# setattr(d,choice,bulk)
# d.talk(d) # 小黄 is yelling...
# 2.方法不写死
setattr(d,choice,bulk)
func = getattr(d,choice)
func(d) # 小黄 is yelling... else:# choice输入money
# 通过字符串设置新的属性
setattr(d, choice, 22)
print(getattr(d,choice)) # 22

3种方式获取obj对象中的name变量指向内存中的值 “alex”

class Foo(object):

    def __init__(self):
self.name = 'alex' def func(self):
return 'func' # 不允许使用 obj.name
obj = Foo() print(obj.name)
print(getattr(obj, 'name'))
print(obj.__dict__['name'])

  

  

Python3学习之路~7.3 反射的更多相关文章

  1. Python3学习之路~0 目录

    目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...

  2. Python3学习之路~8.6 开发一个支持多用户在线的FTP程序-代码实现

    作业: 开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp s ...

  3. Python3学习之路~8.5 SocketServer实现多并发

    前面几节我们写的socket都只能实现服务端与一个客户端通信,并不能实现服务端与多客户端同时通信.接下来我们就来学习一下如何实现服务端同时与多个客户端通信,即并发. Socket Server soc ...

  4. Python3学习之路~9.4 队列、生产者消费者模型

    一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...

  5. Python3学习之路

    python基础知识点 1.python基础知识点汇总 2.python常用数据类型 3.python之列表 4.python之字符串 5.python常用数据运算符 6.python之字典 7.py ...

  6. Python3学习之路~9.1 paramiko模块:实现ssh执行命令以及传输文件

    我们一般使用linux的时候,都是在Windows上安装一个ssh客户端连接上去.那么从一台linux如何连接到另一条linux呢?使用ssh命令即可,因为每台linux机器自己都有一个ssh客户端. ...

  7. Python3学习之路~8.4 利用socket实现文件传送+MD5校验

    利用socket实现文件传送,大约分为如下几步: 1.读取文件名2.检测文件是否存在3.打开文件(别忘了最后关闭文件)4.检测文件大小5.发送文件大小给客户端6.等客户端确认7.开始边读边发数据8.m ...

  8. Python3学习之路~7.5 异常处理

    1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! try: pass except Excepti ...

  9. Python3学习之路~7.4 动态导入模块

    动态导入模块就是只知道str类型的模块名字符串,通过这个字符串导入模块. 准备: 首先创建一个模块目录lib,然后在目录内创建一个模块 aa.py: # aa.pyclass C: def __ini ...

随机推荐

  1. 解决Apache配置虚拟主机时出现403错误的问题

    1.用文本编辑器打开Apache中的httpd.conf,搜索httpd-vhosts.conf,找到“#Include conf/extra/httpd-vhosts.conf”,并把“#”去掉,启 ...

  2. php 的文件操作类

    <?php header('Content-type:text/html;charset=utf8'); Class FILE { private static $path; private s ...

  3. 论文阅读笔记四十五:Region Proposal by Guided Anchoring(CVPR2019)

    论文原址:https://arxiv.org/abs/1901.03278 github:code will be available 摘要 区域anchor是现阶段目标检测方法的重要基石.大多数好的 ...

  4. cmd应用基础 扫盲教程

    cmd是什么? 对于程序员而言,cmd命令提示符是windows操作系统下一个比较重要的工具.对于程序员而言,为了追求更高的效率而抛弃花俏的界面已然是意见很常见的行为,截止到目前的,全世界仍有大量的服 ...

  5. Spring Cloud微服务笔记(一)微服务概念

    微服务概念 一.什么是微服务架构 微服务,是一个小的.松耦合的分布式服务. 为什么需要微服务: 1)单体系统部署在一个进程中,修改了一个小功能,为了部署上线就会影响其他功能. 2)单体应用各个功能模块 ...

  6. Java笔记(二十一) 动态代理

    动态代理 一.静态代理 代理的背后一般至少有一个实际对象,代理的外部功能和实际对象一般是一样的, 用户与代理打交道,不直接接触实际对象.代理存在的价值: 1)节省成本比较高的实际对象创建开销,按需延迟 ...

  7. XV Open Cup named after E.V. Pankratiev. GP of America

    A. Area of Effect 首先最优解中必有一个点在圆的边界上. 若半径就是$R$,则枚举一个点,然后把剩下的事件极角扫描即可,时间复杂度$O(m(n+m)\log(n+m))$. 否则圆必然 ...

  8. 06-JDBC

    JDBC > JAVA Database Connectivity java 数据库连接 * 为什么会出现JDBC > SUN公司提供的一种数据库访问规则.规范, 由于数据库种类较多,并且 ...

  9. php+ajax文件上传

    php+ajax文件上传 html: <input id="user_real_name" class="input_show" type="t ...

  10. java基础 第八章课后习题

    1.什么是二重循环?在内层循环中使用continue和break语句,程序如何跳转? 答:二重循环就是一个循环结构体内又包含另一个完整的循环结构. continue语句跳转时是跳过了内层循环中的剩余语 ...