• 面向对象里的约束与反射应用


    约束

    • 约束子类内必须使用方法,不然主动异常

      class BaseMessage(object):
          def send(self,a1):
              raise NotImplementedError('字类中必须有send方法')
              
      class Msg(BaseMessage):
          def send(self):
              pass
      
      class Email(BaseMessage):
          def send(self):
              pass
      
      class Wechat(BaseMessage):
          def send(self):
              pass
      
      class DingDing(BaseMessage):
          def send(self):
              print('钉钉')
          
      obj = Email()
      obj.send()
      

    反射

    • python一切皆对象,所以想要通过字符串的形式操作内部成员都可以通过反射去完成操作.

    • py文件 包 类 对象...

    • 反射:根据字符串的形式去某个对象操作对象的成员.

      • getattr(对象名,"方法名")

        • 根据字符串的形式去某个对象中获取对象的成员.
        • attribute属性
        class Foo(object):
            def __init__(self,name):
              self.name = name
            def login(self):
              pass
        obj = Foo('alex')
        
        # 获取变量
        v1 = getattr(obj,'name')
        # 获取方法
        method_name = getattr(obj,'login')
        method_name()
        
      • setattr(对象名称,"变量",值 )

        • 根据字符串的形式去某个对象中设置成员.
        class Foo:
          pass
        obj = Foo()
          obj.k1 = 999
        setattr(obj,'k1',123) # obj.k1 = 123
        
          print(obj.k1)
        
      • hasattr(对象名称,"方法名")

        • 根据字符串的形式去某个对象中判断是否含有某成员.返回布尔类型
          class Foo:
              pass
          
          obj = Foo()
          obj.k1 = 999
          hasattr(obj,'k1')
          print(obj.k1)
        
      • delattr(对象,"方法名")

      • 根据字符串的形式去某个对象中删除某成员.

      class Foo:
          pass
      
      obj = Foo()
      obj.k1 = 999
      delattr(obj,'k1')
      print(obj.k1)
      

    模块importlib

    • importlib 用字符串的形式导入模块

      模块 = importlib.import_module('utils.redis')
      
      • 示例:
      import importlib
      
      #用字符串的模式导入模块
      redis = importlib.import_module("utils.redis")
      #用字符串的形式去对象(模块)找到他的成员
      getattr(redis,"func")()
      
      
      self.MIDDLEWARE_CLASSES = [
                  'utils.session.SessionMiddleware',
                  'utils.auth.AuthMiddleware',
                  'utils.csrf.CrsfMiddleware',
              ]
      for mes in self.MIDDLEWARE_CLASSES:
          module_path,class_name=mes.rsplit('.',maxsplit=1)       #切割路径和类名
          module_object = importlib.import_module(module_path)    #插入模块-字符串操作
          cla=getattr(module_object,class_name)        #根据模块对象找到类名(字符串操作-反射)
          obj = cla()      #实例化对象
      	obj.process()      #运行内部函数process
      
      
  • 相关阅读:
    Java生成二维码连接
    Spring boot 整合 Elasticsearch
    Windows下安装ElasticSearch
    springcloud zookeeper+gateway
    idea中Springcloud同时运行多个模块、微服务
    【转】为什么我的DIV块前总有空隙?
    【转载】通过JSFL让Flash Professional CS4或CS5拥有批量FLA导出SVG的功能
    jQuery Mobile中的页面加载与跳转机制
    关于Conversion to Dalvik format failed with error 1错误
    带权重的随机输出数组中的元素
  • 原文地址:https://www.cnblogs.com/bigox/p/10781624.html
Copyright © 2020-2023  润新知