什么是反射
在Python中,反射指的是通过字符串来操作对象的属性,有四种方法
hasattr()
判断对象是否含有字符串对应的数据或者功能getattr()
根据字符串获取对应的变量名或者函数名setattr()
根据字符串给对象设置键值对(名称空间中的名字)delattr()
根据字符串删除对象对应的键值对(名称空间中的名字)
基本使用
hasattr使用
class Student(object):
school = '清华大学'
def get(self):
pass
print(hasattr(Student, 'school'))
# True
print(hasattr(Student, 'get'))
# True
print(hasattr(Student, 'post'))
# False
getattr使用
class Student(object):
school = '清华大学'
def get(self):
pass
print(getattr(Student, 'school'))
# 清华大学
print(getattr(Student, 'get'))
# <function Student.get at 0x7feca09c0510>
print(getattr(Student, 'post')) # 不存在报错
setattr使用
class Student(object):
school = '清华大学'
def get(self):
pass
setattr(Student, 'school', '北京大学')
print(Student.school)
# 北京大学
delattr使用
class Student(object):
school = '清华大学'
def get(self):
pass
delattr(Student, 'school')
print(Student.__dict__)
反射实际应用
应用一
class FtpServer:
def serve_forever(self):
while True:
inp = input('input your cmd>>: ').strip()
try:
cmd, file = inp.split()
except ValueError:
print("输入错误")
continue
if hasattr(self, cmd): # 根据用户输入的cmd,判断对象self有无对应的方法属性
func = getattr(self, cmd) # 根据字符串cmd,获取对象self对应的方法属性
func(file)
else:
print("没有此功能")
def get(self, file):
print('Downloading %s...' % file)
def put(self, file):
print('Uploading %s...' % file)
obj = FtpServer()
obj.serve_forever()
应用二
# 利用面向对象编写系统终端功能
class LinuxCmd(object):
def ls(self):
print("正在执行ls")
def cd(self):
print("正在执行cd")
def ll(self):
print("正在执行ll")
obj = LinuxCmd()
def run(obj):
while True:
cmd = input("请输入指令>>>").strip()
if hasattr(obj, cmd):
fun_name = getattr(obj, cmd)
fun_name()
else:
print("command not found: %s" % cmd)
if __name__ == '__main__':
run(obj)
补充
- 只要在业务中看到关键字对象和字符串(用户输入、自定义、指定) 那么肯定用反射
- 反射提供了一种不需要考虑代码的前提下 操作数据和功能