高级技巧!Python装饰器里面的懒加载,真香!
摄影:产品经理
禁止钓鱼
假设我们有一个工具类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
来装饰两个类属性post
和user
。当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装饰器里面的懒加载,真香!相关推荐
- Python网络爬虫之图片懒加载技术、selenium和PhantomJS
引入 今日概要 图片懒加载 selenium phantomJs 谷歌无头浏览器 知识点回顾 验证码处理流程 今日详情 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材ht ...
- Python Django 惰性查询(懒加载)
- python 装饰器的妙用,实现类属性的懒加载
假设我们有一个工具类MongoUtil,它的作用是封装一些数据库操作.例如: import pymongoclass MongoUtil:def __init__(self):connect = py ...
- python装饰器_python装饰器完全指南之一
设我们有一组函数,它们有共同的错误处理方法,比如打印日志和记录审计信息等.很显然,在每一个函数中都重复这些逻辑是不恰当的,它们应该被提炼到一个函数里,在这个函数的保护下,再调用我们的业务逻辑处理功能. ...
- Vue自定义指令及实现图片懒加载指令
一. 速识概念: 在我们使用 Vue 的过程中,遇到了很多方便我们操作的vue内置指令,以 v-xxx 表示.比如有 v-module,v-for,v-if,v-show 等等,每个指令都能实现一 ...
- python装饰器与闭包_Python 装饰器和闭包
Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...
- 利用世界杯,读懂 Python 装饰器
Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic. 今天就结合最近的世界杯带大家理解下装饰器. 德 ...
- python装饰器原理-看完这篇文章还不懂Python装饰器?
原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...
- python装饰器作用-Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
最新文章
- 干货回顾丨机器学习笔记-----AP(affinity propagat)算法讲解及matlab实现
- leetcode算法题--用两个栈实现队列
- 项目编译失败_Swift源码编译让底层更清晰
- Docker笔记:常用服务安装——Nginx、MySql、Redis(转载)
- 用python编21点游戏_【Python3】21点游戏
- asp.net 的页面几种传值方式
- [翻译:ASP.NET MVC 教程]理解模型、视图和控制器
- Python3中的bytes和str类型
- 疫情期间不忽略障碍群体刚需、仍坚持做无障碍的倡议书
- linux 汉字乱码 window中正常显示
- 估计、偏差 、方差
- Seaborn(三)调色板palette
- 雅思大作文写作--Cities
- 果断型性格分析,果断型人格的职业发展
- pyttsx3 语音包安装、使用详解
- mysql未开启binlog如何恢复数据_MySQL5.7开启binlog日志,及数据恢复简单示例
- 全排列牛客和L46,L47
- 【linux】软件管理
- 小米电脑重装系统后亮度无法调节的解决办法
- 项目07城市餐饮店铺选址分析
热门文章
- 摄像机围绕角色的左右旋转和上下移动的某些知识分享
- 风应力旋度 matlab,[张志伟]中尺度涡所诱发的Ekman Pumping 中尺度涡的垂向结构...
- 【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐
- 辣炒孜然鱿鱼和土豆蔬菜沙拉的做法
- 信号处理(3)——调制
- excel快速填充公式
- Codemirror提示关键词/自动提示
- 基于SMTP协议的模拟邮件系统(计算机网络课程设计)
- kb和KB的关系,k/K表示1000还是1024
- 2019.12.11汇报课反思