反射理论

反射

根据字符串的形式去某个对象中操作它的成员

#示例一
obj = Foo("yang")
v1 = obj.name #此处name是一个变量
v1 = getattr(obj,"name") #与上行等价,此处的name是一个字符串

obj.name = "eric"
setattr(obj,"name","eric") #与上行等价

# 示例二
class Foo(object):
    
    def login(self):
        pass
    
    def register(self):
        pass
#岔路1  
obj = Foo()

obj.login()
method_name = getattr(obj,"login")#相当于不加括号的上一行
method_name()#此时与第一行等价

obj.register()
method_name = getatter(obj,"register")
method_name()
#岔路二
obj = Foo()
func_name = input("请输入方法名:")
getattr(obj,func_name)()
obj.func_name #不可以这样表达,因为此时是去寻找的func_name函数,而不是字符串
  • hasttr(对象,字符串),根据字符串的形式去某个对象中判断是否有该成员

  • setattr(对象,"变量","值")根据字符串的形式去某个对象中设置成员

    class Foo:
        pass
    
    obj = Foo()
    obj.k1 = 999
    setattr(obj,"k1",123) #obj.k1 = 123,如果有便重置覆盖了
    print(obj.k1)
    
  • delattr(对象,"变量")根据字符串的形式去某个对象中删除成员

    class Foo:
        pass
    
    obj = Foo()
    obj.k1 = 999
    delattr(obj,"k1") #obj.k1 = 123,如果有便重置覆盖了
    print(obj.k1)
    

    python中一切皆对象,所以以后想要通过字符串的形式操作其内部成员都可以通过反射机制实现

    • Py文件

    • 对象

      # 测试文件
      #1.
      x1 = [11,22,33]
      #2.
      def func():
          print("func")
      #3.
      class Foo(object):
          X = 1
          def show(self):
              print("Foo.show")
          @staticmethod
          def info():
              print("info")
              
              
              
      # 反射文件
      import 测试
      # print(测试.x1)
      #1
      v1 = getattr(测试,"x1")
      print(v1)
      #2
      v2 = getattr(测试,"func")()
      
      #3.
      v3 = getattr(测试,"Foo")
      print(v3) #输出的是一个类
      
      v4 = getattr(v3,"X")
      
      v5 = getattr(v3,"info")
      v5()
      
      obj = v3()
      m = getattr(obj,"show")
      m()
      
      

胜多负少大V# 反射

根据字符串的形式去某个对象中操作它的成员

#示例一
obj = Foo("yang")
v1 = obj.name #此处name是一个变量
v1 = getattr(obj,"name") #与上行等价,此处的name是一个字符串

obj.name = "eric"
setattr(obj,"name","eric") #与上行等价

# 示例二
class Foo(object):
    
    def login(self):
        pass
    
    def register(self):
        pass
#岔路1  
obj = Foo()

obj.login()
method_name = getattr(obj,"login")#相当于不加括号的上一行
method_name()#此时与第一行等价

obj.register()
method_name = getatter(obj,"register")
method_name()
#岔路二
obj = Foo()
func_name = input("请输入方法名:")
getattr(obj,func_name)()
obj.func_name #不可以这样表达,因为此时是去寻找的func_name函数,而不是字符串
  • hasttr(对象,字符串),根据字符串的形式去某个对象中判断是否有该成员

  • setattr(对象,"变量","值")根据字符串的形式去某个对象中设置成员

    class Foo:
        pass
    
    obj = Foo()
    obj.k1 = 999
    setattr(obj,"k1",123) #obj.k1 = 123,如果有便重置覆盖了
    print(obj.k1)
    
  • delattr(对象,"变量")根据字符串的形式去某个对象中删除成员

    class Foo:
        pass
    
    obj = Foo()
    obj.k1 = 999
    delattr(obj,"k1") #obj.k1 = 123,如果有便重置覆盖了
    print(obj.k1)
    

    python中一切皆对象,所以以后想要通过字符串的形式操作其内部成员都可以通过反射机制实现

    • Py文件

    • 对象

      # 测试文件
      #1.
      x1 = [11,22,33]
      #2.
      def func():
          print("func")
      #3.
      class Foo(object):
          X = 1
          def show(self):
              print("Foo.show")
          @staticmethod
          def info():
              print("info")
              
              
              
      # 反射文件
      import 测试
      # print(测试.x1)
      #1
      v1 = getattr(测试,"x1")
      print(v1)
      #2
      v2 = getattr(测试,"func")()
      
      #3.
      v3 = getattr(测试,"Foo")
      print(v3) #输出的是一个类
      
      v4 = getattr(v3,"X")
      
      v5 = getattr(v3,"info")
      v5()
      
      obj = v3()
      m = getattr(obj,"show")
      m()
      
      
posted @ 2020-12-14 22:16  小杨的冥想课  阅读(145)  评论(0编辑  收藏  举报