摄影:产品经理

禁止钓鱼

假设我们有一个工具类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同理。

我们来测试一下,如下图所示。

可以看到,第二次调用self.post时,并没有打印出第一次访问self.post,因为第二次会直接使用之前的缓存。

最后,特别说明:本文使用MongoDB举例只是为了说明基于装饰器的类属性懒加载的代码写法。而实际上,pymongo已经自动实现了懒加载机制,当我们直接db.tieba.post时,它并不会真的去连接MongoDB,只有当我们要增删改查集合里面的数据时,pymongo才会创建连接。

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
年度爆款文案
  • 1).卧槽!Pdf转Word用Python轻松搞定!

  • 2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃

  • 3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密

  • 4).80行代码!用Python做一个哆来A梦分身

  • 5).你必须掌握的20个python代码,短小精悍,用处无穷

  • 6).30个Python奇淫技巧集

  • 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货

  • 8).再见Python!我要学Go了!2500字深度分析!

  • 9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片

点这里,直达菜鸟学PythonB站!!

高级技巧!Python装饰器里面的懒加载,真香!相关推荐

  1. Python网络爬虫之图片懒加载技术、selenium和PhantomJS

    引入 今日概要 图片懒加载 selenium phantomJs 谷歌无头浏览器 知识点回顾 验证码处理流程 今日详情 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材ht ...

  2. Python Django 惰性查询(懒加载)

  3. python 装饰器的妙用,实现类属性的懒加载

    假设我们有一个工具类MongoUtil,它的作用是封装一些数据库操作.例如: import pymongoclass MongoUtil:def __init__(self):connect = py ...

  4. python装饰器_python装饰器完全指南之一

    设我们有一组函数,它们有共同的错误处理方法,比如打印日志和记录审计信息等.很显然,在每一个函数中都重复这些逻辑是不恰当的,它们应该被提炼到一个函数里,在这个函数的保护下,再调用我们的业务逻辑处理功能. ...

  5. Vue自定义指令及实现图片懒加载指令

    一. 速识概念:   在我们使用 Vue 的过程中,遇到了很多方便我们操作的vue内置指令,以 v-xxx 表示.比如有 v-module,v-for,v-if,v-show 等等,每个指令都能实现一 ...

  6. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  7. 利用世界杯,读懂 Python 装饰器

    Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic. 今天就结合最近的世界杯带大家理解下装饰器. 德 ...

  8. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  9. python装饰器作用-Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

最新文章

  1. 干货回顾丨机器学习笔记-----AP(affinity propagat)算法讲解及matlab实现
  2. leetcode算法题--用两个栈实现队列
  3. 项目编译失败_Swift源码编译让底层更清晰
  4. Docker笔记:常用服务安装——Nginx、MySql、Redis(转载)
  5. 用python编21点游戏_【Python3】21点游戏
  6. asp.net 的页面几种传值方式
  7. [翻译:ASP.NET MVC 教程]理解模型、视图和控制器
  8. Python3中的bytes和str类型
  9. 疫情期间不忽略障碍群体刚需、仍坚持做无障碍的倡议书
  10. linux 汉字乱码 window中正常显示
  11. 估计、偏差 、方差
  12. Seaborn(三)调色板palette
  13. 雅思大作文写作--Cities
  14. 果断型性格分析,果断型人格的职业发展
  15. pyttsx3 语音包安装、使用详解
  16. mysql未开启binlog如何恢复数据_MySQL5.7开启binlog日志,及数据恢复简单示例
  17. 全排列牛客和L46,L47
  18. 【linux】软件管理
  19. 小米电脑重装系统后亮度无法调节的解决办法
  20. 项目07城市餐饮店铺选址分析

热门文章

  1. 摄像机围绕角色的左右旋转和上下移动的某些知识分享
  2. 风应力旋度 matlab,[张志伟]中尺度涡所诱发的Ekman Pumping 中尺度涡的垂向结构...
  3. 【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐
  4. 辣炒孜然鱿鱼和土豆蔬菜沙拉的做法
  5. 信号处理(3)——调制
  6. excel快速填充公式
  7. Codemirror提示关键词/自动提示
  8. 基于SMTP协议的模拟邮件系统(计算机网络课程设计)
  9. kb和KB的关系,k/K表示1000还是1024
  10. 2019.12.11汇报课反思