首先大家应该知道python是一个强类型的动态解释型语言
动态的定义:当程序运行时才会为对象定义数据类型
一、什么是反射:
指的是程序运行过程中可以动态(在程序运行时)获取对象的信息
二、为何要用反射:
Python是一门动态语言,只有在程序运行时才能知道数据的类型及对象包含的属性和方法,比如:
def func(obj): return obj.x#当调用传入一个obj对象时,首先要判断该对象是否包含‘x’这个属性 func(10)# 若随意传入一个值时则会报错 # 思路(以下代码肯定是会报错的,但思路是对的): def func(obj): if 'x' not in obj.__dict__:#应当判断是否含有'x'这个属性 return None return obj.x func(10)
三、实现反射机制的步骤(原理)
class P: def __init__(self, age, name): self.name = name self.age = age def say(self): print(self.name,self.age) obj = P(18, 'egon') # 1、先通过dir:查看某一个对象下可以.出哪些属性来 print(dir(obj)) # 2、可以通过字符串反射到真正的属性上,得到属性值 print(obj.__dict__[dir(obj)[-2]])# obj. age=====》原理
简单介绍四个内置函数:通过字符串来操作属性值
hasattr()# 判断对象是否存在 print(hasattr(obj,'name')) getattr()# 获取属性 print(getattr(obj,'name')) setattr()# 为属性赋值 print(setattr(obj,'name','egon')) print(obj.name) delattr()# 删除属性 delattr(obj,'name')
补充1:
res1=getattr(obj,'say')# 也可通过字符串操作方法 res2=getattr(P,'say') print(res2) print(res1) #输出结果为: <function P.say at 0x0000021618C98E50> <bound method P.say of <__main__.P object at 0x00000216080E12B0>>
补充2:
print(hasattr(10, 'x')) # 查看10下是否有属性x print(getattr(10, 'x', None)) # 指定一个默认参数 None(当获取不到属性时,返回一个指定参数) obj=10 if hasattr(obj,'x'):# 判断obj是否含有x属性 getattr(obj,'x')# 若存在获取 obj.x的属性值 else: print('不存在x属性') if hasattr(obj,'x'): setattr(obj,'x',20)# 若存在为obj.x属性赋值==》obj.x=20 else: pass
反射小案例:
class Ftp: def put(self): print('正在执行上传功能') def get(self): print('正在执行下载功能') def interactive(self): method=input('>>>>>').strip()# 如:method='put' if hasattr(self,method): getattr(self,method)() else: print('输入的指令不存在') obj=Ftp() obj.interactive() # 运行结果1: >>>>>sssss 输入的指令不存在 # 运行结果2 >>>>>put 正在执行上传功能
这是我看了林海峰老师视频的总结,若有补充或错误,欢迎大佬们指出。