反射
一、反射
- 手动输入要运行的功能,反着去模块里找
二、相关函数
1. getattr(对象,属性(字符串形式))
- 从对象中获取属性
class Person: country = "China" def eat(self): print("-----eat-----") obj = Person() print(getattr(Person, "country")) # China # 类名.方法名(对象):方法调用的另一种方式 getattr(Person, "eat")(obj) # -----eat----- getattr(obj, "eat") # -----eat-----
2. hasattr(对象,属性(字符串形式))
- 判断对象中是否有该属性
class Person: country = "China" def eat(self): print("-----eat-----") obj = Person() print(hasattr(Person, "country")) # True print(hasattr(obj, "run")) # False
3. setattr(对象,属性(字符串形式),值)
- 如果属性存在,则更改属性的值
- 如果属性不存在,则新增属性,并把值赋给属性
class Person: country = "China" def eat(self): print("-----eat-----")
obj = Person() setattr(Person, "eat", 3) # 此时内存中函数eat变为eat = 3 obj.eat() # 报错
4. delattr(对象,属性(字符串形式))
- 删除对象中的属性
class Person: country = "China" def eat(self): print("-----eat-----") obj = Person() delattr(Person, "eat") obj.eat() # 'Person' object has no attribute 'eat'
注:以上四个函数都是对加载到内存中的代码进行操作的,并不会影响源代码
5.总结:
1)对于属性:
-
getattr(类名,属性(字符串形式)) ----->类.属性
-
getattr(对象,属性(字符串形式)) ----->对象.属性
-
setattr(类名,属性(字符串形式),值) ----->修改类属性的值
- setattr(对象,属性(字符串形式),值) ----->给对象添加属性
- delattr(类名,属性(字符串形式)) ----->删除对象属性
- delattr(对象,属性(字符串形式)) ----->报错,对象没有该属性
2)对于实例方法:
- getattr(类名,属性(字符串形式))(对象) ----->调用实例方法
- getattr(对象,属性(字符串形式))() ----->调用实例方法
- setattr(类名,属性(字符串形式),值) ----->如果属性名存在,则修改方法,类型根据值的类型,如果不存在,则新增。给类新增函数时,需要考虑函数形参个数,如果无形参,则用对象.函数名调用报错
- setattr(对象,属性(字符串形式),值) ----->如果属性名存在,则给对象添加属性,类型根据值的类型,如果不存在,则新增
- delattr(类名,属性(字符串形式)) ----->删除对象方法
- delattr(对象,属性(字符串形式)) ----->报错,对象没有该属性
三、应用
场景:如果已知py文件有哪些方法,但想测试各方法作用,摘一摘自己想用的内容
# master.py文件里内容: def run(): print("-----run-----") def eat(): print("-----eat-----") def drink(): print("-----drink-----")
代码:
import master from types import FunctionType while 1: gn = input("请输入你要测试的功能:") if hasattr(master, gn): # 如果master里面有你要的功能 # 获取这个功能,并执行 attr = getattr(master, gn) # 判断是否是函数,只有函数才可以被调用 if isinstance(attr, FunctionType): attr() else: # 如果不是函数, 就打印 print(attr)