Python反射
反射:用字符串类型的名字去操作变量,没有安全问题。本质是反射对象中的属性和方法。
反射对对应的方法有:getattr, setattr, delattr
getattr:一般与hasattr联合使用
class A: def func(self): print('in func') a = A() a.name = 'alex' a.age = 63 # 反射对象的属性 ret = getattr(a,'name') # 通过变量名的字符串形式取到的值 print(ret) print(a.__dict__) ###打印属性与方法 print(a.__dir__())
class A: a_list =[1, 3, 5, 7, 9] @classmethod def func(cls): print(cls.a_list) @staticmethod def func2(): print(A.a_list, "太好了") print(getattr(A, 'a_list')) print(getattr(A, 'func')()) getattr(A, 'func2')() 【注】反射类的方法只支持 :classmethod staticmethod,不支持类函数
# import mymodule # 反射模块的属性 # print(my.day) # print(getattr(mymodule,'day')) # 反射模块的方法 # getattr(mymodule,'wahaha')() ################# def func(): print('func111111') year = 2018 # 反射自己模块中的变量 print(getattr(sys.modules['__main__'],'year')) # 反射自己模块中的函数 getattr(sys.modules['__main__'],'func')() 变量名 = input('>>>') print(getattr(sys.modules[__name__],变量名)) # 内置模块 # time # asctime # import time # print(getattr(time,'time')()) # print(getattr(time,'asctime')())
print(time.strftime('%Y-%m-%d %H:%M:S')) print(getattr(time, 'strftime')('%Y-%m-%d %H:%M:S'))
setattr:设置修改变量
class A: pass a = A() setattr(a,'name','nezha') setattr(A,'name','alex') print(A.name) print(a.name)
delattr:删除一个变量
class A: pass a = A() setattr(a,'name','nezha') setattr(A,'name','alex') print(A.name) print(a.name) delattr(a,'name') print(a.name) delattr(A,'name') print(a.name)
反射demo
class Teacher: dic = {'查看学生信息':'show_student','查看讲师信息':'show_teacher'} def show_student(self): print('show_student') def show_teacher(self): print('show_teacher') @classmethod def func(cls): print('hahaha') alex = Teacher() for k in Teacher.dic: print(k) key = input('输入需求 :') # print(Teacher.dic[key]) if hasattr(alex,Teacher.dic[key]): func = getattr(alex,Teacher.dic[key]) func() # hasattr getattr delattr if hasattr(Teacher,'dic'): ret = getattr(Teacher,'dic') # Teacher.dic # 类也是对象 print(ret)

浙公网安备 33010602011771号