首先大家应该知道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
正在执行上传功能
这是我看了林海峰老师视频的总结,若有补充或错误,欢迎大佬们指出。