反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
python面向对象中的反射:通过字符串的形式操作对象的相关属性和方法
python中一切事物皆对象(都可以使用反射)
操作对象:
实例化对象 类 本模块 其他模块
四个函数
hasattr 检测是否存在
getattr获取
setattr设置
delattr删除
如何使用
实例化对象
class A: country = '中国' def __init__(self,name,age): self.name = name self.age = age def func(self): print('in A func') obj = A('小红',18) print(hasattr(obj,'name')) #判断是否存在,返回True 或 False print(getattr(obj,'name')) #获取,属性会得到属性值 print(getattr(obj,'func')) #获取,方法会得到一个对象内存地址 setattr(obj,'小明',23) #新增或修改,按照参数位置进行操作 print(obj.__dict__) delattr(obj,'name') #删除 print(obj.__dict__)
类
class A: country = '中国' def __init__(self,name,age): self.name = name self.age = age @classmethod def func(cls): print('这个是类方法') @staticmethod def func1(): print('这个是静态方法') print(hasattr(A,'country')) print(getattr(A,'country')) ret = getattr(A,'func') ret() ret1 = getattr(A,'func1') ret1() setattr(A,'wang',28) print(A.__dict__) delattr(A,'country') print(A.__dict__)
其他模块
import tbjx content = input('请输入内容') if hasattr(tbjx,content): print(getattr(tbjx,content)) #1.利用反射执行register函数 ret = getattr(tbjx,'register') ret('xing','123456') #2.利用反射获取A类country的属性 print(getattr(getattr(tbjx,'A'),'country')) #3.利用反射获取A类,实例化一个对象,并获得对象的name,age 属性 obj = getattr(tbjx,'A')('小红',23) print(getattr(obj,'name'))
本模块
def func1(): print('in 反射 func1') import sys ret = sys.modules[__name__] print(sys.modules[__name__]) #<module '__main__' from 'C:/Users/15471/PycharmProjects/newpro/day23/exercise.py'> #当前py文件作为对象,调用func1函数 getattr(ret,'func1')() #获取并执行func1函数
反射的实例
class User: def login(self): print('欢迎来到登录页面') def register(self): print('欢迎来到注册页面') def save(self): print('欢迎来到存储页面') while 1: choose = input('请输入你的应用').strip() obj = User() if hasattr(obj,choose): #两行代码,搞定所有的if判断 getattr(obj,choose)()