约束

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

    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

最新文章

  1. 看看C# 6.0中那些语法糖都干了些什么(中篇)
  2. 隐藏UITableView多余的分割线
  3. Storm系统高可用性HA表现
  4. JSP页面批量选择&全选操作&选择回显
  5. logback.xml_appender配置
  6. leetcode@ [307] Range Sum Query - Mutable / 线段树模板
  7. Java网络编程(TCP协议-练习-上传文本文件)
  8. (hdu)5547 Sudoku (4*4方格的 数独 深搜)
  9. 使用第三方框架 Masonry 实现自动布局
  10. java线程之停止线程
  11. synchronized 原理分析
  12. JS的事件模型
  13. Redis主从配置和哨兵监控配置——服务器端环境搭建
  14. mysql 分库分表 ~ 方案选择浅谈
  15. 【rabbitmq】安装卸载
  16. linux基础之find
  17. 12. The Biggest Safety Threat Facing Airlines 航空公司面临的最大安全威胁
  18. Scapy Fuzz实现——S7协议从建连到“正常交流“(一)
  19. [django]django查询最佳实战
  20. 深入解密.NET(GC垃圾回收)

热门文章

  1. [MySQL] MVCC 多版本并发控制实现的事务
  2. 如何在Eclipse中彻底修改一个项目名称
  3. 在Docker中体验数据库之Mongodb
  4. 基于windows环境的Flask网站搭建(mysql + conda + redis)
  5. 升级Mac OS X上的git
  6. Postman学习之【压力测试】
  7. 简单介绍python的双向队列
  8. Aspnet mvc移除WebFormViewEngine
  9. anaconda的scikit-learn报错It seems that scikit-learn has not been built
  10. Windows -- 从注册表删除IE浏览器加载项