反射就是通过字符串映射或修改程序运行时的状态、属性、方法
有四个常用方法:
-
hasattr(obj,name_str) 判断一个obj对象是否有对应name_str的方法
-
getattr(obj,name_str) 根据字符串name_str获取obj对象中对应方法的内存地址
-
setattr(obj,key,value) 为对象obj新增或修改属性或者方法
-
delattr(obj,name_str) 删除对象obj中名为name_str的属性或者方法
反射demo举例:
#!/usr/bin/env python # _*_ coding:utf-8 _*_ ''' hasattr(obj,name_str) 判断一个obj对象是否有对应name_str的方法 getattr(obj,name_str) 根据字符串name_str获取obj对象中对应方法的内存地址 setattr(obj,key,value) 为对象obj新增或修改属性或者方法 delattr(obj,name_str) 删除对象obj中名为name_str的属性或者方法 ''' def bulk(self): print("%s is yelling"%self.name) class dog(object): def __init__(self,name): self.name=name def eat(self,food): print("%s is eating %s"%(self.name,food)) jim=dog("jim") choise=input(">>输入需要执行的操作:").strip() if hasattr(jim,choise): func=getattr(jim,choise) func("巧克力") #delattr(jim,choise) else: #python学习交流群:153708845 #动态装配一个方法 choise为方法名,bulk为方法的内存地址 setattr(jim,choise,bulk) # 调用时用转配的方法名,即传入的choise值,这里需要传入对象本身 getattr(jim,choise)(jim) #动态装配一个属性,也可以修改属性 setattr(jim,choise,"新装配的属性") print(getattr(jim,choise)) #print(jim.name) #jim.eat("狗粮")
发表评论