什么是反射
在Python中,反射指的是通过字符串来操作对象的属性,有四种方法
hasattr()判断对象是否含有字符串对应的数据或者功能getattr()根据字符串获取对应的变量名或者函数名setattr()根据字符串给对象设置键值对(名称空间中的名字)delattr()根据字符串删除对象对应的键值对(名称空间中的名字)
基本使用
hasattr使用
class Student(object):school = '清华大学'def get(self):passprint(hasattr(Student, 'school'))# Trueprint(hasattr(Student, 'get'))# Trueprint(hasattr(Student, 'post'))# False
getattr使用
class Student(object):school = '清华大学'def get(self):passprint(getattr(Student, 'school'))# 清华大学print(getattr(Student, 'get'))# <function Student.get at 0x7feca09c0510>print(getattr(Student, 'post')) # 不存在报错
setattr使用
class Student(object):school = '清华大学'def get(self):passsetattr(Student, 'school', '北京大学')print(Student.school)# 北京大学
delattr使用
class Student(object):school = '清华大学'def get(self):passdelattr(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("输入错误")continueif 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)
补充
- 只要在业务中看到关键字对象和字符串(用户输入、自定义、指定) 那么肯定用反射
- 反射提供了一种不需要考虑代码的前提下 操作数据和功能
