反射的认识

一、反射中几个重要词的认识

  • 1、hasattr(object, name)判断对象是否有该属性
  • 2、getattr(object, name, default=None)获取对象属性
  • 3、setattr(x, y, v)设置属性
  • 4、delattr(x, y)删除属性

二、使用上面几个方法

class Animal(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

if __name__ == "__main__":
    animal = Animal('动物', 20)
    print(animal.__dict__)
    # 1.判断一个属性是否在对象中
    print(hasattr(animal, 'name'))
    print(hasattr(animal, 'age'))
    # 2.获取属性的值
    print(getattr(animal, 'name'))
    # 3.setattr设置值
    setattr(animal, 'color', '黄色')
    print(animal.__dict__)

    # 4.删除值
    delattr(animal, 'name')
    print(animal.__dict__)

三、反射的主要用途

反射是可以事先定义好接口,然后判断,只有接口在完成后才会真正的执行(只要有就会执行)

  • 例如:

      class FtpClient(object):
              """
              定义一个ftp的客户端
              """
    
              def __init__(self, address):
                      self.address = address
    
              def get(self):
                      pass
    
      if __name__ == "__main__":
              f1 = FtpClient('192.168.1.1')
              if hasattr(f1, 'get'):
                      print('调用get函数')
              else:
                      print('get函数不存在')
    

四、类使用hasattrgetattrsetattr

class Foo(object):
    staticField = '哈哈'

    def __init__(self):
        self.name = '张三'

    def func(self):
        return 'func'

    @staticmethod
    def bar():
        return 'bar'

if __name__ == "__main__":
    print(getattr(Foo, 'staticField'))
    print(getattr(Foo, 'func'))
    print(getattr(Foo, 'bar'))
    print(hasattr(Foo, 'bar'))

五、使用反射导包

  • 1、导入当前包

      import sys
    
      def s1():
              print('s1')
    
      def s2():
              print('s2')
    
      if __name__ == "__main__":
              this_module = sys.modules[__name__]
              print(hasattr(this_module, 's1'))
              print(getattr(this_module, 's2'))
    
  • 2、导入别的地方的包

      # 正常导包的方式
      # from day11.lib import test
    
      # 使用反射导包
      module_t = __import__('lib.test')
      if __name__ == "__main__":
              # print(test.test())
              print(module_t)
              print(module_t.test)
              print(module_t.test.test())
    
  • 3、使用importlib导包

      import importlib
    
      m = importlib.import_module('lib.test')
    
      if __name__ == "__main__":
              print(m.test())
    

六、类中使用__getattr____setattr____delattr__的使用

  • 1、基本认识

      class Foo(object):
              x = 1
    
              def __init__(self, y):
                      self.y = y
    
              def __getattr__(self, item):
                      """
                      在获取值的时候触发
                      """
                      print('--->getattr方法', item)
    
              def __setattr__(self, key, value):
                      """
                      会在设置值或者修改值的时候触发该方法,
                      但是要自己手动赋值
                      """
                      print('==',self.__dict__)
                      self.__dict__[key] = value
                      print('--->setattr方法', key, value)
    
              def __delattr__(self, item):
                      print('--->delattr方法', item)
    
  • 2、赋值的时候限制数据类型

      class Foo(object):
              def __init__(self, name):
                      self.name = name
    
              def __setattr__(self, key, value):
                      print('---setattr', key, value)
                      if type(value) is str:
                              self.__dict__[key] = value
                      else:
                              print('赋值必须的字符串类型')
    
              def __getattr__(self, item):
                      print(item)
    
              def __delattr__(self, item):
                      print('--delattr', item)
    

results matching ""

    No results matching ""