day28 反射 属性操作 getattr hasattr setattr delattr

反射
用字符串来对应其同名的属性或者方法,通过某种方法调用这个字符串来执行方法或者获取属性
网络编程的时候非常好用,是很重要的内容

先看个示例吧:
 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~    # 从字符串反射过去方法执行结果



转载于:https://www.cnblogs.com/shijieli/p/9923165.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值