zoukankan      html  css  js  c++  java
  • 面向对象里的约束与反射应用

    约束

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

      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
      
      
  • 相关阅读:
    mysql外键添加error1215
    shell命令获取最新文件的名称
    centos7 apache提供文件下载
    centos7 时间设置
    微服务通信的类型
    angular-cli
    npm
    模块相关
    加油!冲冲冲
    软件评测
  • 原文地址:https://www.cnblogs.com/bigox/p/10781624.html
Copyright © 2011-2022 走看看