反射 用字符串来对应其同名的属性或者方法,通过某种方法调用这个字符串来执行方法或者获取属性 网络编程的时候非常好用,是很重要的内容 先看个示例吧:
1 class Teather: 2 dic = { 3 "查看学生信息":"show_student", 4 "查看讲师信息":"show_teacher" 5 } 6 7 def show_student(self): 8 print("学生:羊驼") 9 10 def show_teacher(self):11 print("讲师:羊驼")12 13 @classmethod14 def func(cls):15 print("ahahah")16 17 alex = Teather()18 for k in Teather.dic:19 print(k)20 key = input("请输入指令:")21 print(Teather.dic[key]) # 查看讲师信息 # 输出具体指令 22 print(type(Teather.dic[key])) ## 字符串类型23 getattr(alex,Teather.dic[key])() # 讲师:羊驼 # 通过字符串反射到同名方法执行得出结果
具体用到的方法: hassattr 判断属性或者方法是否存在 getattr 字符串反射属性或者方法 delattr 删除属性 setattr 创建属性,如果存在则重新赋值,不存在则创建后赋值
1 class A(): 2 def __init__(self,name): 3 self.name = name 4 5 def hi(self): 6 return f"hi~{self.name}~" 7 8 a = A(name="lala") 9 print(hasattr(a,"name")) # True # 创建后存在此属性了10 print(a.name) # lala11 print(a.hi()) # hi~lala~12 13 delattr(a,"name")14 print(hasattr(a,"name")) # False # 删除属性后不存在此属性了15 # print(a.name) # AttributeError: 'A' object has no attribute 'name'16 # delattr(a,"hi") # AttributeError: hi # 不能删除对象的方法17 print(a.hi()) # 删除了属性并不会影响这个实例调用其本就可以调用的其他方法,仅仅是失去那个属性18 19 # a.name = "haha" # 直接创建赋值这样感觉最简单最方便20 setattr(a,"name","haha") # setattr 其实和上面是等效的,但是用起来还麻烦些.21 setattr(a,"age",19) # setattr 也可以做到创建未存在的属性不存在则添加并赋值22 print(a.name) # haha23 print(a.age) # 1924 25 str = "hi"26 if hasattr(a,str): # 判断一下是否存在这个属性或者方法27 print(getattr(a,str)()) # hi~haha~ # 从字符串反射过去方法执行结果