假设我们有一个工具类MongoUtil,它的作用是封装一些数据库操作。例如:

import pymongoclass MongoUtil:def __init__(self):connect = pymongo.MongoClient()db = connect.tiebaself.post = db.postself.user = db.userdef write_post(self, post):# 处理post信息self.post.insert_one(post)def read_user_info(self):rows = self.user.find()# 读取user信息并处理# ...

我们发现这样写有一个问题——类在初始化的时候,就会创建数据库的链接。但我们并不是在类刚刚初始化时就读写数据库。

为了让数据库在第一次使用时再创建连接,我们就要实现懒加载机制:

import pymongoclass MongoUtil:def __init__(self):connect = pymongo.MongoClient()self.db = connect.tiebaself.post = Noneself.user = Nonedef write_post(self, post):# 处理post信息if not self.post:self.post = self.db.postself.post.insert_one(post)def read_user_info(self):if not self.user:self.user = self.db.userrows = self.user.find()# 读取user信息并处理# ...

这样写确实实现了懒加载,但每一个操作都需要判断当前是否联系到了对应的集合中。这样就会出现大量的重复代码。

为了解决这个问题,我们可以使用装饰器实现一个懒加载机制:

import pymongoclass lazy:def __init__(self, func):self.func = funcdef __get__(self, instance, cls):if instance is None:return selfelse:value = self.func(instance)setattr(instance, self.func.__name__, value)return valueclass MongoUtil:def __init__(self):connect = pymongo.MongoClient()self.db = connect.tieba@lazydef post(self):return self.db.post@lazydef user(self):return self.db.userdef write_post(self, post):# 处理post信息self.post.insert_one(post)def read_user_info(self):rows = self.user.find()# 读取user信息并处理# ...

我们实现了一个装饰器类lazy来装饰两个类属性postuser。当self.post第一次被调用时,它会正常连接结合,当第二次或以上访问self.post时,就会直接使用第一次返回的对象,不会再次连接MongoDB的集合。self.user同理。

python 装饰器的妙用,实现类属性的懒加载相关推荐

  1. 懒加载和预加载的区别_类的动态创建(ro,rw)amp; 懒加载类和非懒加载类底层加载的区别 amp; 类和分类的搭配分析...

    黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Python开发点击右侧关注,探讨技术话题!作者丨OSMin链接:https://juejin.im/post/5 ...

  2. 由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类

    上一篇:由浅入深,走进Python装饰器-----第四篇:进阶--函数装饰类 类装饰器 @类 类 4.1 用类装饰器来扩展原类( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发_ ...

  3. python装饰器由浅入深_由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类

    **类装饰器** @类 类 4.1 用类装饰器来扩展原函数( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发__call__方法,进行返回 class KuoZhan(): de ...

  4. python装饰器类-Python 装饰器装饰类中的方法

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  5. python装饰器实例-基于Python 装饰器装饰类中的方法实例

    title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...

  6. python装饰器类-基于类的python装饰器

    python装饰器函数其实是这样一个接口约束,它必须接受一个callable对象作为参数,然后返回一个callable对象.在Python中一般callable对象都是函数,但也有例外.只要某个对象重 ...

  7. python类装饰器详解-Python 装饰器详解

    开放封闭原则: 开放对扩展 封闭修改源代码 改变了人家调用方式 装饰器结构 """ 默认结构为三层!!!每层返回下一层内存地址就可以进行执行函数, 传参:语法糖中的传参可 ...

  8. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

  9. python类装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

最新文章

  1. Access数据库出现的0x80004005 Unspecified error问题
  2. Linux下安装Tomcat7
  3. 全球及中国生物质能利用产业现状调研及十四五建设布局规划报告2021-2027年
  4. ALV 简单实现HTML抬头的方法 (介绍 二)
  5. spring boot 引用外部配置文件
  6. 5G PDCCH介绍
  7. Java语法基础50题训练(下)
  8. [蓝桥杯2017初赛]算式900+dfs,next_permutation
  9. Linux socket编程(一) 对套接字操作的封装
  10. 使用runtime 实现weex 跳转原生页面
  11. 为什么引入devops_DevOps可以为您的文档做什么?
  12. html css纯写桌球运动轨迹,纯JS实现椭圆轨迹运动的代码
  13. C语言实现:素数的判断的多种方法
  14. 家用无线路由器选购指南。
  15. 电游入侵传统教育,用练级学习
  16. Java开发 - 树(二叉树,二叉排序树,红黑树)
  17. 64位操作系统,mysql ODBC 驱动程序和应用程序之间的体系结构不匹配
  18. python水位传感器输出水位_水位传感器坏了的表现_判断水位传感器好坏方法
  19. html中单选按钮设置监听事件,浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio...
  20. RSD 教程 —— §3.2 创建的层

热门文章

  1. Python 使用控制台运行带有相对路径的指令时,是以运行文件为基准,还是以控制台当前路径为基准
  2. CSDN markdown 如何更改文字字体、样式、颜色、大小?
  3. Python 程序扩展名(py, pyc, pyw, pyo, pyd) 及发布程序时的选择
  4. linux——Firewalld与iptables的基本配置
  5. linux——数据库mariadb的基础操作
  6. 计数排序、桶排序和基数排序的运算性能对比及总结区别(附python代码)
  7. JavaScript的常用工具汇总
  8. android动态jar,Android动态加载Jar(包含第三方依赖Jar)
  9. qemu debug linux内核,qemu调试linux内核
  10. android 判断手机计步_干货:电脑控制手机 一定不能错过的神器