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丢失修复方法?现在…

HTML和CSS篇章高频面试题【2023】

html篇章 什么是 HTML5? html是一种超文本标记语言,html5它更侧重于语义化,对于seo、搜索引擎优化更好,可以大量应用在移动设备上。 HTML5有哪些的新特性? 新增布局标签:head、footer、nav、article、sect…

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

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

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

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

数学建模国赛C蔬菜类商品的自动定价与补货决策C

数学建模国赛C蔬菜类商品的自动定价与补货决策C 完整思路和代码请私信~~~ 1.拟解决问题 这是一个关于生鲜商超蔬菜商品管理的复杂问题,需要综合考虑销售、补货、定价等多个方面。以下是对这些问题的总结: 问题 1: 蔬菜销售分析 需要分析蔬菜各品类和…

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 找不到一个优…

什么是事务?Spring是通过什么进行事务开发?

当我们谈到“事务”时,通俗地说,它指的是一系列操作,这些操作被视为单个逻辑单元,这些操作必须要么全部完成,要么全部撤回。 一个典型的例子是转账,如果在转账过程中出现了错误,那么这个事务需…

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

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

【Hive】drop table需注意外部表

什么是内部表,外部表? 比较专业的定义: 外部表需要转为内部表,执行删除操作才能真的删表结构删表数据。否则drop table仅是删除了表数据,表结构还是存在的。 alter table tb_name set TBLPROPERTIES(EXTERNALfalse);…

P1119 灾后重建

题目背景 B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,…

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…

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

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

2个按键加减操作

/*----------------------------------------------- 内容&#xff1a;按一次按键&#xff0c;led点亮&#xff0c;再按一次熄灭&#xff0c;以此循环 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动…