反射(*****)
重点:v = getattr(obj , “func”) # 根据字符串为参数(第二个参数),去对象(第一个参数)中寻找与之同名的成员。
应用一、首先定义一个handler模块,handler.py文件内容如下:
模块:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def chi(): print("大牛一顿吃100碗饭") def he(): print("大牛一顿喝一桶") def la(): print("大牛很能拉") def shui(): print("大牛一次睡一年") name = "大牛"
test.py
引入 import master
盖特 getattr() 从xxx对象或者模块中找xxxxx(字符串) 功能, 变量
孩子 hasattr() 判断第二个是否在第一个里面
while 1: print("""大牛写了很多的功能: chi he la shui """) val = input("请输入你要测试的功能") # he if hasattr(master, val): attr = getattr(master, val) # 从xxx对象或者模块中找xxxxx(字符串) 功能, 变量 if callable(attr): # 判断这个鬼东西是否可以被调用 attr() else: print(attr) else: print("没有这个功能")
# 把chi函数换成lambda # print(master.chi) # setattr(master, "chi", lambda x: x + 1) # print(master.chi) delattr(master, "la") # 删除xxx master.la()
盖特 getattr() 从xxx对象或者模块中找xxxxx(字符串) 功能, 变量
孩子 hasattr() 判断第二个是否在第一个里面
面向对象的反射:
class Person: def __init__(self, name): self.name = name self.age = None def chi(self): print("人喜欢吃东西%s" % self.name) p = Person("刘伟") val = input("请输入你想让刘伟执行的动作:") if hasattr(p, val): getattr(p, "name") func = getattr(p, val) func()
setattr
setattr(p, "name", "大阳哥") # 动态的给对象设置属性和值 setattr(p, "age", 18) # 很少用. 慎用
delattr 删除
delattr(p, "age")
反射就是,先定好我要执行什么功能,然后去你里面找
总结:
getattr # 根据字符串的形式,去对象中找成员;
hasattr # 根据字符串的形式,去判断对象中是否有成员;
setattr # 根据字符串的形式,动态的设置一个成员(内存);
delattr # 根据字符串的形式,动态的删除一个成员(内存);