python知识:有效使用property装饰器

一、说明

        Python是唯一有习语(idioms)的语言。这增强了它的可读性,也许还有它的美感。装饰师遵循Python的禅宗,又名“Pythonic”方式。装饰器从 Python 2.2 开始可用。PEP318增强了它们。下面是一个以初学者为中心的教程,介绍如何使用装饰器。如果您希望自己运行代码示例,请继续阅读! 

二、装饰

        A(不要与装饰器模式混淆)是一种在不更改原始函数的情况下添加/更改函数行为的方法。在 Python 中,装饰器是一种设计模式,允许您通过将函数包装在另一个函数中来修改函数的功能。外部函数称为装饰器,它将原始函数作为参数并返回修改后的版本。decorator

让我们以身作则。在这里,我们声明一个装饰器。它有助于打印函数的输出,而不是添加打印命令,打印命令后来变得笨拙,有时删除起来非常乏味。debug


def debug(function):def wrapper(name, address):print ('Debugging:')func = function(name, address)print (func)return wrapper@debug
def typical_crunching_function(name, city):return 'You are '+ name + ' from '+ citytypical_crunching_function('John','Los Angeles')

输出:

Debugging:
You are John from Los Angeles 

在这里,我们定义了装饰器,并使用@语法应用于函数。line 1-6typical_crunching_function line 8

三、Python 类装饰器

类装饰器于 PEP3129 年引入。这是在社区的很多阻力之后,他们更喜欢.主要目的是将装饰函数的能力扩展到类。metaclasses

下面是一个增强函数功能的类装饰器示例。

class Accolade:def __init__(self, function):self.function = functiondef __call__ (self, name):# Adding Excellency before namename = "Excellency " + nameself.function(name)# Saluting after the nameprint("Thanks "+ name+ " for gracing the occasion")@Accolade
def simple_function(name):print (name)simple_function('John McKinsey')

输出:

Excellency John McKinsey
Thanks Excellency John McKinsey for gracing the occasion

        这里定义了类,可用于对simple_function执行预处理和后处理。在此示例中,我们只是添加到字符串中,并在打印名称后,感谢他们为这个场合增光添彩。这个简单的例子演示了我们可以使用类装饰器轻松地对函数参数执行预处理和后处理。这些预处理任务可以是以下任何一项,但不限于这些。CleanerExcellencyname,

  • 添加计时信息
  • 连接到数据库
  • 关闭连接
  • 记忆存储

示例2:


class Decorator(object):def __init__(self, fget=None, fset=None, fdel=None, doc=None):self.fget = fgetself.fset = fsetself.fdel = fdelself.__doc__ = docdef __get__(self, instance, owner):if instance is None:return selfreturn self.fget(instance)def __set__(self, instance, value):self.fset(instance, value)def __delete__(self, instance):self.fdel(instance)def getter(self, fget):return Decorator(fget, self.fset, self.fdel, self.__doc__)def setter(self, fset):return Decorator(self.fget, fset, self.fdel, self.__doc__)def deleter(self, fdel):return Decorator(self.fget, self.fset, fdel, self.__doc__)class Target(object):desc = "Amazing pyhton"def __init__(self, attr=5):self._x = attr@Decoratordef show(self):return self._x@show.setterdef show(self, value):self._x = value@show.deleterdef show(self):del self._x

四、一些内置的类装饰器

        下面是一些内置的类装饰器。

4.1 缓存/记忆

        请注意,它仅在Python >= 3.9中可用。这允许缓存以前的值并重用它们,而不是重新计算它们。

from functools import cache@cache
def factorial(n):return n * factorial(n-1) if n else 1print(factorial(10))

输出:

3628800

4.2 属性property

property的意义

@property把一个类的getter方法变成属性,如果还有setter方法,就在setter方法前面加上@method.setter。使用类属性=property(getx,setx,delx,desc)也是可以的。

实现很简单,那么它背后的原理是什么呢?

Property类的伪代码如下,里面涉及了__get__、__set__、__delete__魔法方法。Decorator类是装饰器类,Target是目标类。当你设置装饰器类的实例对象为目标类的x属性后,当试图访问目标类的x属性会触发装饰器类的__get__方法;当为目标类的x属性赋值时,会触发装饰器类的__setter__方法;尝试删除目标类的x属性时,会触发装饰器类的__delete__方法。当访问Target.x.__doc__,可以打印出装饰器类的描述文档。事实上这种装饰器类也被称为描述符类。描述符类就是将一个特殊类的实例指派给一个类的属性。

类属性实现方式:
示例1:

        这个装饰器允许将 setter 和 getter 函数添加到类中的属性。

class Pencil:def __init__(self, count):self._counter=count@propertydef counter(self):return self._counter@counter.setterdef counter(self, count):self._counter = count@counter.getterdef counter(self):return self._counterHB = Pencil(100)
print (HB.counter)
HB.counter = 20
print (HB.counter)

输出:

100
20 

示例2:


class Decorator(object):def __init__(self, fget=None, fset=None, fdel=None, doc=None):self.fget = fgetself.fset = fsetself.fdel = fdelself.__doc__ = docdef __get__(self, instance, owner):if instance is None:return selfreturn self.fget(instance)def __set__(self, instance, value):self.fset(instance, value)def __delete__(self, instance):self.fdel(instance)def getter(self, fget):return Decorator(fget, self.fset, self.fdel, self.__doc__)def setter(self, fset):return Decorator(self.fget, fset, self.fdel, self.__doc__)def deleter(self, fdel):return Decorator(self.fget, self.fset, fdel, self.__doc__)class Target(object):desc = "Amazing pyhton"def __init__(self, attr=5):self._x = attrdef getx(self):return self._xdef setx(self, value):self._x = valuedef delx(self):del self._xx = Decorator(getx,setx,delx,desc)

 

4.3 缓存属性cached_property

此修饰器允许缓存类的属性。这等于嵌套两个装饰器。

@cached
@property
def counter:return self._counter

五、结论

        装饰器是非常方便和优雅的工具,但是,它们也很容易出错。因此,应非常小心地使用它们。查看下面的课程,获得 Python 装饰器的实践经验!  教育团队

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安科瑞精密配电多回路监控装置在轨道交通项目上的应用

行业背景 轨道交通作为城市公共交通系统的一部分,在过去几十年中得到了广泛的发展和扩张。它在解决城市交通拥堵、减少环境污染、提高城市可持续性等方面发挥了重要作用。随着科技的进步,轨道交通系统也在不断引入新的技术和创新,以提高运行…

WPF Material Design 初次使用

文章目录 前言相关资源快速开始快速开始说明地址 吐槽一下 前言 MD全称MaterialDesignInXamlToolkit,MaterialDesign和Bootstrap一样,都是一个UI风格库。相当于衣服中的休闲服,汉服,牛仔裤一样,就是风格不一样的Ui框架…

VR钢铁实训 | 铁前事业部虚拟仿真培训软件

随着科技的发展,虚拟现实技术在各个行业中的应用越来越广泛。在钢铁冶炼行业中,VR技术也逐渐得到了应用,其中铁前事业部虚拟仿真培训软件就是一项非常有优势的技术。 铁前事业部虚拟仿真培训软件是广州华锐互动打造的《钢铁生产VR虚拟培训系统…

msvcp110.dll是什么意思与msvcp110.dll丢失的解决方法

电脑突然提示msvcp110.dll丢失,无法执行此代码。导致软件无法打开运行,这个怎么办呢?我在网上找了一天的资料,终于把这个问题彻底处理好,也弄清楚了msvcp110.dll丢失的原因及msvcp110.dll丢失修复方法?现在…

docker从零部署jenkins保姆级教程(上)

jenkins,基本是最常用的持续集成工具。在实际的工作中,后端研发一般没有jenkins的操作权限,只有一些查看权限,但是我们的代码是经过这个工具构建出来部署到服务器的,所以我觉着有必要了解一下这个工具的搭建过程以及简…

网络通信深入解析:探索TCP/IP模型

http协议访问web 你知道在我们的网页浏览器的地址当中输入url,未必是如何呈现的吗? web浏览器根据地址栏中指定的url,从web服务器获取文件资源(resource)等信息,从而显示出web页面。web使用HTTP&#xff08…

vs code调试rust乱码问题解决方案

在terminal中 用chcp 65001 修改一下字符集,就行了。有的博主推荐 修改 区域中的设置,这会引来很大的问题。千万不要修改如下设置:

八个针对高级职位的高级 JavaScript 面试题

JavaScript 是一种功能强大的语言,是网络的主要构建块之一。这种强大的语言也有一些怪癖。例如,您是否知道 0 -0 的计算结果为 true,或者 Number("") 的结果为 0? 问题是,有时这些怪癖会让你摸不着头脑&…

同步推送?苹果计划本月推出 iOS17和iPadOS17,你的手机支持吗?

据报道,苹果公司计划在本月推出 iOS 17 和 iPadOS 17 正式版更新。与去年不同的是,这次更新将同时发布,而不是分别发布。根据彭博社的一位消息人士马克・古尔曼的说法,苹果公司认为 iOS 17 和 iPadOS 17 的第八个测试版已经非常接…

动态库的制作与使用及 动态库加载失败解决

加载动态库时有时会出现error while loading shared libraries:libcalc.so:可以通过lld命令查看动态库的依赖关系,发现libcalc.so时not found 原因 查找的优先级是DT_RPATH->LD_LIBRARY_PATH->/etc/ld.so.cache->/lib/,/usr/lib 找不到一个优…

文心一言api接入如何在你的项目里使用文心一言

文心一言api接入在项目里接入文心一言 一、百度文心一言API二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API 基于百度文心一言语言大模型的智能文本对话AI机器人…

java读取服务器数据包并下载至本地目录

jsch包如果没有的话,可评论联系我,我私发给你,或者通过https://mvnrepository.com/artifact/com.jcraft/jsch/0.1.55进行下载,添加至工程目录 package com.hbisdt.dqbasic.modular.util;import com.jcraft.jsch.*;import java.i…

【word技巧】如何在word文件中方框打对勾?

Word文件制作了调查问卷或者信息表之类的文件,总是少不了有需要打勾的选项,如果打印成了纸质文件打勾就简单了,但是在word文件中应该如何在方框中打√符号呢?今天分享三个方法。 方法一: 先输入一个大写的R&#xff…

个人信息去标识化具体实施指南

声明 本文是学习个人信息去标识化指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 范围 本标准描述了个人信息去标识化的目标和原则,提出了去标识化过程和管理措施。 本标准针对微数据提供具体的个人信息去标识化指导,适…

哈希的应用——布隆过滤器

文章目录 前言1. 布隆过滤器提出2. 布隆过滤器概念3. 布隆过滤器的插入多哈希函数映射减少冲突结构定义及set(插入)函数实现 4. 布隆过滤器的查找test(查找)函数实现布隆过滤器允许误判 5. 布隆过滤器的适用场景6. 如何选择布隆过…

JVM 对象的内存布局

对象头 Mark word 标记字段 用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等 ClassPoint 类型指针 对象指向它的类型元数据的指针,Java虚拟机通过这个指针 来…

延时消息队列

目录 前言 一、延时队列实用场景 二、DelayQueue DelayQueue的实现 使用延迟队列 DelayQueue实现延时任务的优缺点 三、RocketMQ 原理 四、Kafka 原理 实现 DelayMessage定义 消息发送代码 消费者代码 参考 前言 延时队列的内部是有序的,最重要的…

Linux之NFS服务器

目录 Linux之NFS服务器 简介 NFS背景介绍 生产应用场景 NFS工作原理 NFS工作流程图 流程 NFS的安装 安装nfs服务 安装rpc服务 启动rpcbind服务同时设置开机自启动 启动nfs服务同时设置开机自启动 NFS的配置文件 主配置文件分析 示例 案例 --- 建立NFS服务器&#…

【Python】环境的搭建

前言 要想能够进行 Python 开发, 就需要搭建好 Python 的环境. 需要安装的环境主要是两个部分: 运行环境: Python开发环境: PyCharm 一、安装 Python 1.找到官方网站 官网:Welcome to Python.org 2.找到下载页面 点击download中的Windows 3.选择稳定版中的Win…

【计算机网络】HTTPS

文章目录 1. HTTPS的概念2. 加密常见的加密方式对称加密非对称加密 3. HTTPS的工作过程的探究方案1 —— 只使用对称加密方案2 —— 只使用 非对称加密方案3 —— 双方都是用非对称加密方案4 —— 非对称加密对称加密中间人攻击引入证书CA认证理解数据签名 方案5 —— 非对称加…