• 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~    # 从字符串反射过去方法执行结果



  • 相关阅读:
    MSXML应用总结
    MsXml创建和解析XML示例
    解决IAR无法跳转的问题
    总结4
    1012
    1010
    acm学习总结
    1005
    1004
    1006
  • 原文地址:https://www.cnblogs.com/shijieli/p/9923165.html
Copyright © 2020-2023  润新知