反射
用字符串来对应其同名的属性或者方法,通过某种方法调用这个字符串来执行方法或者获取属性
网络编程的时候非常好用,是很重要的内容
先看个示例吧:
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 @classmethod
14 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])) # <class 'str'> # 字符串类型
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) # lala
11 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) # haha
23 print(a.age) # 19
24
25 str = "hi"
26 if hasattr(a,str): # 判断一下是否存在这个属性或者方法
27 print(getattr(a,str)()) # hi~haha~ # 从字符串反射过去方法执行结果