python中的反射
反射 通过字符串操作对象(类,空间)的属性或方法
可以以整个模块(py文件)作为对象,调用模块中的函数
可以使用.(点)来调用的都可以用反射的方式去做
反射是一组:四个方法
hasattr *** 判断类或者对象是否有这个属性或方法有则返回Ture无则返回False
getattr *** 得到类或对象的属性值或函数的地址
setattr * 设置类或对象的属性,或方法
delattr * 删除类或对象的属性或方法
class A: rock = '洛奇' def __init__(self, name, age): self.name = name self.age = age def func(self): print('666') print(hasattr(A, 'rock')) # 判断A这个类中是否有rock属性 print(hasattr(A, 'func')) # 判断A这个类中是否有func方法 # # # 可以通过输入或接收字符串来执行相应的方法 content = input('>>>:').strip() print(hasattr(A, content)) print(getattr(A, content)) # 若输入的是func if hasattr(A, content): getattr(A, content)(1) a = A('bob', 18) print(hasattr(a, 'name')) # Ture print(hasattr(a, 'gender')) # False print(getattr(a, 'age')) # 18 setattr(a, 'gender', 'male') print(a.__dict__) # {'name': 'bob', 'age': 18, 'gender': 'male'} setattr(a, 'func2', lambda x: x**2) print(a.func2(2)) # 4 def func3(x): print(x) # setattr(a, 'func3', func3) # 可给类或对象增加一个方法 a.func3(2) # 2 delattr(a, 'name') print(a.__dict__) # 删除对象的一个属性
同过sys模块吧模块名当作对象,利用反射操作本模块中的函数和变量
# 同过sys模块吧模块名当作对象,利用反射操作本模块中的函数和变量 import sys obj = sys.modules[__name__] # print(obj) # print(obj.__dict__) # print(globals()) # obj1 = globals() # print(obj1['__file__']) def func1(): print('in func1') def func2(): print('in func2') def func3(): print('in func3') l1 = ['func%s' % i for i in range(1, 4)] # ['func1', 'func2', 'func3'] print(l1) for i in l1: getattr(obj, i)() # # # 通过输入相应序号执行相应函数 content = int(input('>>>:')) getattr(obj, l1[content-1])()
通过反射调用其他模块中的函数,变量,类
# 在另一个文件中写好以下代码 # 如day22 flag = True def func(a): print(a) return a + 3 class B: name_list = ['rock', 'America'] def __init__(self, name, gender): self.name = name self.gnder = gender def func(self): print(4455) # 新建一个模块 # 首先导入模块 import day22 # 到另一模块中flag的值 print(getattr(day22, 'flag')) # # # 执行另一模块中func函数 print(getattr(day22, 'func')(10)) # 调用另一模块中B类中的name_list print(getattr(day22.B, 'name_list')) # 调用另一模块中B类中的func方法 getattr(day22.B, 'func')(1) # 用另一模块中的B类实例化对象b b = day22.B('rock', '男') # 用b对象调用类中的方法 print(getattr(b, 'name_list')) # 用b对象调用自己的属性 print(getattr(b, 'name')) getattr(b, 'func')()