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

news2024/10/11 8:28:39

一、说明

        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 '+ city

typical_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 = function
    
  
  def __call__ (self, name):
    # Adding Excellency before name
    name = "Excellency " + name
    self.function(name)
    # Saluting after the name
    print("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 = fget
        self.fset = fset
        self.fdel = fdel
        self.__doc__ = doc
 
    def __get__(self, instance, owner):
        if instance is None:
            return self
        return 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
    @Decorator
    def show(self):
        return self._x
 
    @show.setter
    def show(self, value):
        self._x = value
 
    @show.deleter
    def 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 1

print(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
  
  @property
  def counter(self):
    return self._counter
  
  @counter.setter
  def counter(self, count):
    self._counter = count

  @counter.getter
  def counter(self):
    return self._counter

HB = 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 = fget
        self.fset = fset
        self.fdel = fdel
        self.__doc__ = doc
 
    def __get__(self, instance, owner):
        if instance is None:
            return self
        return 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
    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
 
    x = Decorator(getx,setx,delx,desc)

 

4.3 缓存属性cached_property

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

@cached
@property
def counter:
  return self._counter

五、结论

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

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

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

相关文章

Jdk1.7之ConcurrentHashMap源码总结

文章目录 一、常见属性1. 初始化容量2. 加载因子3. 并发级别 二、重要方法1. 构造方法2. ConcurrentHashMap#put方法2.1 ConcurrentHashMap#put#ensureSegment2.2 ConcurrentHashMap#Segment#put2.2.1 Segment#put#scanAndLockForPut2.2.2 Segment#put#rehash 3. ConcurrentHas…

linux内核如何根据文件名索引到文件内容

https://zhuanlan.zhihu.com/p/78724124 根据文件名索引到文件内容 表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过in…

迅为RK3568开发板驱动指南第六篇-平台总线

文档教程更新至第六篇 第1篇 驱动基础篇 第2篇 字符设备基础 第3篇 并发与竞争 第4篇 高级字符设备进阶 第5篇 中断 第6篇 平台总线 未完待续,持续更新中... 视频教程更新至十一期 第一期_驱动基础 第二期_字符设备基础 第三期_并发与竞争 第四期_高级字…

解释模块化开发及其优势,并介绍常用的模块化规范。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 模块化开发⭐ 模块化开发的优势⭐ 常用的模块化规范⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是…

公众号hanniman往期精选

目录 一、AI产品分析(10篇) 二、AI产品经理(10篇) 三、AI技术(10篇) 四、AI行业及个人成长(10篇) 一、AI产品分析 1、【重点】深度 | 关于AIGC商业化的13个非共识认知(80…

华为OD机试 - 滑动窗口最大和

滑动窗口的经典题型&#xff0c;重复题目 #include <stdio.h> #include <string.h> #include <stdlib.h>#define MAX(a,b) ((a) > (b) ? (a) : (b)) int main() {int n;scanf("%d", &n);int *list malloc(sizeof(int) * n);for (int i …

[学习笔记]DeepWalk图神经网络论文精读

参考资料&#xff1a;DeepWalk【图神经网络论文精读】 word2vec 相关论文&#xff1a; Efficient Estimation of Word Representations in Vector Space Distributed Representations of Words and Phrases and their Compositionality 随机游走Ramdom Walk简述 通过随机游…

LLMs之Falcon 180B:Falcon 180B的简介、安装、使用方法之详细攻略

LLMs之Falcon 180B&#xff1a;Falcon 180B的简介、安装、使用方法之详细攻略 导读&#xff1a;Falcon-180B是一个由TII发布的模型&#xff0c;它是Falcon系列的升级版本&#xff0c;是一个参数规模庞大、性能优越的开放语言模型&#xff0c;适用于各种自然语言处理任务&#x…

Net跨平台UI框架Avalonia入门-样式详解

设计器的使用 设计器预览 在window和usercontrol中&#xff0c;在代码中修改了控件&#xff0c;代码正确情况下&#xff0c;设计器中就可以实时看到变化&#xff0c;但是在样式&#xff08;Styles&#xff09;文件中&#xff0c;无法直接看到&#xff0c;需要使用设计器预览D…

uni-app 前面项目(vue)部署到本地win系统Nginx上

若依移动端的项目&#xff1a;整合了uview开源ui框架&#xff0c; 配置后端请求接口基本路径地址&#xff1a; 打包复现到nginx下&#xff1a; 安装个稳定版本的&#xff1a;nginx-1.24.0 部署配置&#xff1a; 增加了网站&#xff1a;8083端口的&#xff0c; 网站目录在ngi…

Reactor

1.epoll底层工作原理 creat: 红黑树 就绪队列 回调机制 control: 用户告诉内核做什么事情&#xff0c;就是操作红黑树 wait: 操作就绪队列 2.LT ET模式 3.Reactor 4.前摄式

懒汉式逆向APK

作者&#xff1a;果然翁 通过各方神仙文档,以及多天调试,整理了这篇极简反编译apk的文档(没几个字,吧).轻轻松松对一个apk(没壳的)进行逆向分析以及调试.其实主要就是4个命令. 准备 下载apktool &#xff1a;https://ibotpeaches.github.io/Apktool/install/下载Android SDK …

被问到: http 协议和 https 协议的区别怎么办?别慌,这篇文章给你答案

前言 作为软件测试师&#xff0c;大家都知道一些常用的网络协议是我们必须要了解和掌握的&#xff0c;比如 HTTP 协议&#xff0c;HTTPS 协议就是两个使用非常广泛的协议&#xff0c;所以也是面试官问的面试的时候问的比较多的两个协议&#xff1b;因为这两个协议有相似和关联的…

CSP 202209-1 如此编码

答题 题目就是字多 #include<iostream>using namespace std;int main() {int n,m;cin>>n>>m;int a[n],c[n1];c[0]1;for(int i0;i<n;i){cin>>a[i];c[i1]c[i]*a[i];}for(int i0;i<n;i){cout<<(m%c[i1]-m%c[i])/c[i]<< ;} }

基于 Flink CDC 高效构建入湖通道

摘要&#xff1a;本文整理自阿里云 Flink 数据通道负责人、Flink CDC 开源社区负责人&#xff0c; Apache Flink PMC Member & Committer 徐榜江&#xff08;雪尽&#xff09;&#xff0c;在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分&#xff1a; 1. Flin…

2.4 选择结构语句

选择结构语句根据是否满足某个条件确定执行哪些操作&#xff0c;分为if条件语句和switch条件语句。 1. 单分支if语句 &#xff08;1&#xff09;if语句是指如果满足某种条件&#xff0c;就进行某种处理&#xff0c;格式如下。 if(条件) {// 执行语句 } 根据上述格式中&…

有限状态机的概念

一、有限状态机的概念 有限状态机简称状态机&#xff0c;是表示有限个状态&#xff0c;以及在状态之间的转移和动作等行为的数学模型。状态机的要素有状态和状态转移两个。 在Unity中&#xff0c;动画状态机最重要的属性就是节点和连线&#xff0c;其中每个节点都是一个动画片…

zotero的使用教程

1. zotero安装 1.1 下载 官网下载地址:Zotero 1.2 安装 建议自定义安装路径,不要安装在C盘。如以下步骤: 2. 插件安装 一般安装以下四种插件,即茉莉花(Jasminum)、zotfile、zotero-scihub、zotero-pdf-translate。以安装茉莉花插件为例进行说明,如图1所示,其余插件安…

Linux mac Windows三系统 局域网文件共享方法

主要工具&#xff1a; Samba是一个开源的软件套件&#xff0c;允许Linux系统与Windows系统之间共享文件和打印机。 一、首先是Linux共享的设置 ①安装 sudo apt-get install samba ②创建共享文件夹 sudo mkdir /home/share ③配置用户 sudo smbpasswd -a kequan ④修改…

软件测评的必要性,第三方软件测试机构推荐

软件测评报告 1、什么是软件测评报告&#xff1f; 测试报告是指把测试的过程和结果写成文档&#xff0c;对发现的问题和缺陷进行分析&#xff0c;为纠正软件的存在的质量问题提供依据&#xff0c;同时为软件验收和交付打下基础。 2、软件测评报告的作用 一份详细的测试报告…