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
同理。
python 装饰器的妙用,实现类属性的懒加载相关推荐
- 懒加载和预加载的区别_类的动态创建(ro,rw)amp; 懒加载类和非懒加载类底层加载的区别 amp; 类和分类的搭配分析...
黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Python开发点击右侧关注,探讨技术话题!作者丨OSMin链接:https://juejin.im/post/5 ...
- 由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类
上一篇:由浅入深,走进Python装饰器-----第四篇:进阶--函数装饰类 类装饰器 @类 类 4.1 用类装饰器来扩展原类( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发_ ...
- python装饰器由浅入深_由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类
**类装饰器** @类 类 4.1 用类装饰器来扩展原函数( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发__call__方法,进行返回 class KuoZhan(): de ...
- python装饰器类-Python 装饰器装饰类中的方法
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
- python装饰器实例-基于Python 装饰器装饰类中的方法实例
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
- python装饰器类-基于类的python装饰器
python装饰器函数其实是这样一个接口约束,它必须接受一个callable对象作为参数,然后返回一个callable对象.在Python中一般callable对象都是函数,但也有例外.只要某个对象重 ...
- python类装饰器详解-Python 装饰器详解
开放封闭原则: 开放对扩展 封闭修改源代码 改变了人家调用方式 装饰器结构 """ 默认结构为三层!!!每层返回下一层内存地址就可以进行执行函数, 传参:语法糖中的传参可 ...
- python装饰器类-PYTHON里的装饰器能装饰类吗
扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...
- python类装饰器详解-Python装饰器基础概念与用法详解
本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...
最新文章
- Access数据库出现的0x80004005 Unspecified error问题
- Linux下安装Tomcat7
- 全球及中国生物质能利用产业现状调研及十四五建设布局规划报告2021-2027年
- ALV 简单实现HTML抬头的方法 (介绍 二)
- spring boot 引用外部配置文件
- 5G PDCCH介绍
- Java语法基础50题训练(下)
- [蓝桥杯2017初赛]算式900+dfs,next_permutation
- Linux socket编程(一) 对套接字操作的封装
- 使用runtime 实现weex 跳转原生页面
- 为什么引入devops_DevOps可以为您的文档做什么?
- html css纯写桌球运动轨迹,纯JS实现椭圆轨迹运动的代码
- C语言实现:素数的判断的多种方法
- 家用无线路由器选购指南。
- 电游入侵传统教育,用练级学习
- Java开发 - 树(二叉树,二叉排序树,红黑树)
- 64位操作系统,mysql ODBC 驱动程序和应用程序之间的体系结构不匹配
- python水位传感器输出水位_水位传感器坏了的表现_判断水位传感器好坏方法
- html中单选按钮设置监听事件,浅谈监听单选框radio改变事件(和layui中单选按钮改变事件),单选框radio...
- RSD 教程 —— §3.2 创建的层
热门文章
- Python 使用控制台运行带有相对路径的指令时,是以运行文件为基准,还是以控制台当前路径为基准
- CSDN markdown 如何更改文字字体、样式、颜色、大小?
- Python 程序扩展名(py, pyc, pyw, pyo, pyd) 及发布程序时的选择
- linux——Firewalld与iptables的基本配置
- linux——数据库mariadb的基础操作
- 计数排序、桶排序和基数排序的运算性能对比及总结区别(附python代码)
- JavaScript的常用工具汇总
- android动态jar,Android动态加载Jar(包含第三方依赖Jar)
- qemu debug linux内核,qemu调试linux内核
- android 判断手机计步_干货:电脑控制手机 一定不能错过的神器