python装饰器详解&单例类装饰器实现

python之无参装饰器 在讲装饰器之前,要知道以下知识点 一、储备知识点 1.*args,**kwargs def index(x,y): print(x,y) def wrapper(*args,**kwargs): index(*args,**kwargs) #index(y = 222,x = 111) wrapper(y = 222, x = 111) 2.名称空间与作用域:名称空间的‘嵌套’关系是在函数定义阶段,即检测语法的时候确定的。 3.函数对象 可以把函数当做参数传入 可以把行数当做返回值返回 def in 阅读详情

单例类装饰器的实现在文章最后面

1、不带参数的装饰器

我们用一个实际的例子来引入装饰器的概念,比如我们现在有一个方法Method(),然后我们需要在方法Method()执行之前在终端打印"Method is running",最简单的方法是在方法A()的开始部分加上一行代码:print("Method is running")

能不能不修改方法A()的代码实现这个功能呢?答案是肯定的,可以写一个方法decorator(),然后把A()作为入参,代码如下:

def decorator(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        print("Method is running")
        return fun()
    return wrapper

python中的方法可以作为参数传入另一个方法,所以当我们执行decorator(Method)的时候,返回值实际也是一个“方法”,这个“方法”会先执行print("Method is running")语句,然后再执行Method()。

这样修改后Method()代码确实没有变化,但是客户端的调用代码需要进行修改,之前调用方法Method (),现在是调用decorator(Method)(),为了不影响客户端调用代码,我们使用python的语法糖改造方法Method()的代码。

@decorator
def Method():
    # do something

实际上只是在Method()的前面加上一行@decorator,这样客户端代码中调用Method()实际上就相当于调用decorator(Method)()。

装饰器中的@functools.wraps(fun)可以保证返回的方法__name__属性和入参方法fun的__name__属性相同。

2、带入参的装饰器

上面不带参数的装饰器中,我们实现了在执行方法Method()之前打印"Method is running",如果我们想要打印自定义的字符串,就需要使用带参数的装饰器。

实际上就是在不带参数的装饰器上再封装一层即可,代码如下:

def decorator_par(name):
    def decorator(fun):
        @functools.wraps(fun)
        def wrapper(*args, **kwargs):
            print("Method {} is running".format(name))
            return fun()
        return wrapper
    return decorator

在使用装饰器的时候设置参数name,实现打印不同的信息。完整的代码如下:

import functools

def decorator_par(name):
    def decorator(fun):
        @functools.wraps(fun)
        def wrapper(*args, **kwargs):
            print("Method {} is running".format(name))
            return fun()
        return wrapper
    return decorator

@decorator_par("A")
def A():
    print("I am A")

@decorator_par("B")
def B():
    print("I am B")

A()
B()

输出为:

Method A is running
I am A
Method B is running
I am B

3、单例类装饰器的实现

在python中使用装饰器来实现一些重复性的工作很方便,例如下面实现的单例装饰器方法,在任何类前面加上@singleton就可以将该类修改成一个单例类,在开发具体的类的时候只需要关注具体类的功能即可,这就是装饰器的便捷之处。

def singleton(cls):
    def wrapper(*args, **kwargs):
        if not hasattr(cls, "__single_instance"):
            setattr(cls, "__single_instance", cls(*args, **kwargs))
            wrapper.clean = lambda : delattr(cls, "__single_instance")
        return getattr(cls, "__single_instance")
    return wrapper


@singleton
class Apple:
    def __init__(self, color, price):
        self.color = color
        self.price = price


apple1 = Apple("red", 1.2)
print(f"apple1 id: {id(apple1)}, color: {apple1.color}, price: {apple1.price}")

apple2 = Apple("green", 0.7)
print(f"apple2 id: {id(apple2)}, color: {apple2.color}, price: {apple2.price}")

Apple.clean()
apple3 = Apple("green", 1.5)
print(f"apple3 id: {id(apple3)}, color: {apple3.color}, price: {apple3.price}")

上面的代码输出如下(python3.6.6):

apple1 id: 2476531484320, color: red, price: 1.2
apple2 id: 2476531484320, color: red, price: 1.2
apple3 id: 2476531484432, color: green, price: 1.5

可以看到前两次实例化的apple1和apple2内存地址是相同的,说明Apple类被singleton装饰后实现了单例,然后调用Apple.clean()清除了缓存的单例对象之后,就可以重新生成一个新的对象apple3。

上面的实现使用动态绑定特性,python中的类实际上也是一个对象,因此可以动态的绑定属性和方法。

【Python实现单例模式】 单例模式(Singleton Pattern)是一种常用的软件设计模式,它可以确保一个类只有一个实例对象,并提供一个全局访问点。在单例模式中,一个类只允许创建一个对象实例,并且提供一个访问该实例的全局方法。 阅读详情

相关推荐

Python单例--装饰器实现方式

A = singleton(A),可以包装成语法糖,也就是@singleton,用@singleton修改类A。答:Python中实现单例有很多种方式,上面给出的是装饰器方式实现的单例。答:就是一个类只能创建出唯一的实例。Python单例–装饰器实现方式。

onebutterfly 354

Python实现单例模式

Python中单例模式的实现方法和应用场景

bb8886的博客 1万+

Unity游戏开发客户端面经——网络(初级)

Unity游戏开发客户端面经 之 网络 篇

Sea3752的博客 1万+

单例模式(Python中的单例类)

单例模式是一种常用的软件设计模式。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。1.单例模式的类只提供私有的构造函数,

__Samual的博客 3685

TSEND_C指令错误代码解析与实战排错指南

本文详细解析西门子PLC中TSEND_C指令的常见错误代码,包括连接建立、参数配置、资源限制和网络通信等错误类型。针对错误代码80C4等典型问题提供实战排错指南,帮助工程师快速诊断和解决工业通信中的连接故障,提升系统可靠性。

backprop5master的博客 414

从仿真到实践:两级直接耦合放大电路的静态工作点协同调试指南

本文详细解析了两级直接耦合放大电路的静态工作点协同调试方法,从仿真到实践提供系统指南。重点介绍了Rc2电阻调整技巧、集电极电位测量方法及常见问题排查,帮助工程师解决各级静态工作点相互影响的难题,提升模拟电路设计效率。

weixin_29189373的博客 124

python装饰器详解

python装饰器

weixin_44992737的博客 8万+

content-pipeline:一条可落地的内容生产流水线

content-pipeline 是一种将内容创作工程化的系统性方法,其核心在于用确定性流程替代碎片化人工操作。它基于结构化提示(prompt)、预置叙事框架与品牌参数固化三大原理,实现从素材输入到多平台发布的端到端自动化。技术价值体现在显著降低认知负荷、保障输出一致性、支持本地化资源绑定与闭环反馈校验。典型应用场景包括技术教程批量生成、跨平台(公众号/小红书/即刻)内容适配、AI写作质量可控迭代等。本文深入解析其作为‘内容制造业’基础设施的底层设计逻辑与实操路径,尤其聚焦Claude Code环境下的真实

weixin_31199559的博客 269

你不一定全知道的四种Python装饰器实现详解

本文详细介绍了Python中的四类装饰器,这四类装饰器根据装饰器和被装饰对象的类型分为函数的函数装饰器、类的函数装饰器、函数的类装饰器、类的类装饰器,文中详细介绍了四类装饰器的实现步骤,并提供了对应的实现案例,相关介绍有助于大家全面及详细地理解Python的装饰器。

老猿Python 1万+

Visual Studio Code 打开java项目

在 Visual Studio Code 中打开并运行一个 Java 项目之前,你需要确保你已经完成了一些初始设置。

2675

MIMIC数据库简介

一 、MIMIC简介 MIMIC(Medical Information Mart for Intensive Care),是一个大型的公开数据库。该数据库记录了2001年至2019年期间贝斯以色列女狄肯斯医疗中心重症监护病房患者的相关数据,拥有4万多名患者的医疗健康数据和记录。 MIMIC数据库记录了人口统计学信息,如病人的性别、身高、宗教等情况。记录了实验室检验信息,如血常规,肝功能,肾功能等实验室检测数据。记录了患者的用药信息,如高血压患者服用了治疗高血压类药物等。记录了护理人员以及患者的护理级别等。

越努力 越幸运 1万+

Python装饰器详解

详细介绍了Python装饰器语法的有关内容与使用技巧,希望对大家有所帮助。

千山暮彩 1万+

移植Google Gemini Nano到RK3588 NPU,实现高效边缘推理

在嵌入式 AI 开发中,大家常常会遇到模型在硬件平台上运行时出现性能瓶颈的问题,比如推理速度慢、功耗过高,这严重影响了应用的实时性和稳定性 ,导致性能瓶颈,无法满足如智能安防、工业检测等场景的实时性需求。为了解决这些问题,我们可以将轻量模型移植到具有强大算力的硬件平台上。本文将手把手教你将 Google Gemini Nano(或类似轻量模型)移植到 RK3588 NPU,充分发挥 RK3588 NPU 的 6Tops 算力,实现高效的模型推理,提升嵌入式系统的 AI 处理能力。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 296

python中装饰器详解

装饰器 我们知道,在python中,我们可以像使用变量一样使用函,这主要依赖于以下几点: 函数可以被赋值给其他变量 函数可以被删除 可以在函数里面再定义函数,函数嵌套。 函数可以作为参数传递给另外一个函数 函数可以作为另一个函数的返回值 对一个简单的函数进行装饰 为了更好的理解装饰器,我们先从一个简单的例子开始,假设有下面这个函数: def hello(): return...

AFeng521web 7939

BioEmu 扩散模型加速传统分子动力学(MD)模拟

BioEmu 是一种创新的生成式深度学习系统,通过高效采样和准确预测蛋白质的动态机制,为蛋白质科学和药物设计提供了新的工具。它在多构象采样、MD 模拟拟合和蛋白质稳定性预测方面表现出色,同时显著降低了计算成本。BioEmu 的开发为未来蛋白质动态研究和应用奠定了坚实基础。

weixin_42357472的博客 320

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python类装饰器:编写单例类的完整指南

单例模式是一种创建型设计模式,其主要目标是确保类只有一个实例,并提供一个全局访问点。这有助于在整个应用程序中共享相同的资源,避免重复创建相同对象。在本文中,分享了使用Python类装饰器编写单例类的方法,通过详细的示例代码和解释,提供了一种优雅而高效的实现单例模式的方式。首先介绍了传统的单例模式实现方法,然后引入了类装饰器的概念,展示了如何使用装饰器简化单例类的创建过程。通过实际应用示例,演示了单例模式在数据库连接管理和日志记录器等场景中的应用。

涛哥聊Python 1559

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

函数装饰器和类装饰器实现单例类

单例类,指的是这个类只能创建一个实例,创建完成后,其他类实例都无法再创建。今天我们来看一下,使用函数装饰器和类装饰器怎么实现这种特殊一点的类。 函数装饰器实现 装饰器算是类里面比较难的内容之一,但是实际上它的思想并不复杂。简单点说,就是在你原来内容的基础上,在外面给你加点东西,实现类似装饰的效果。但是它是怎么实现的呢?一般来说,都是通过拦截函数调用来实现的,比如:用装饰器装饰函数的时候,它拦截...

shark_tear的专栏 417

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python装饰器的实现和万能装饰器

Python装饰器的实现和万能装饰器 在Python中,装饰器是在不改变已有函数的代码的前提下,给函数增加新的功能的一种函数。 装饰器接收一个函数作为参数,返回值也是一个函数。 在Python中,实现装饰器的方式叫做闭包。 一、闭包的实现 闭包是指函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。 闭包的使用,可以隐藏内部函数的工作细节,只给外部...

weixin_43790276的博客 5987

Python装饰器的使用详解

在函数嵌套的前提下,内部函数使用外部函数的变量,并且外部函数返回内部函数我们把这个使用外部函数变量的内部函数称为闭包。

lIujunXHU的博客 2712

Python--装饰器详解

一、基本概念。

墨上烟雨 1788

python3装饰器详解

本文将带你学习装饰器在 Python 中的工作原理,如果在函数和类中使用装饰器,如何利用装饰器避免代码重复(DRY 原则,Don’t Repeat Yourselfdef __init__(self, a, *args, **kwargs): # 类装饰器参数self.a = adef __call__(self, func): # 被装饰函数print("开始调用example函数..............")example()self.a = a# @语法糖等价形式。

海哥python的博客 1888

python 装饰器详解

python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:实质: 是一个函数参数:是你要装饰的函数名(并非函数调用)返回:是装饰完的函数名(也非函数调用)作用:为已经存在的对象添加额外的功能特点:不需要对对象做任何的代码上的变动。

1334
上一篇: tensorflow编译和Eigen3不兼容报错解决 -- error: the value of ‘j’ is not usable in a constant expression
下一篇: 快速排序--递归实现&非递归实现(c语言)
__Destiny__
博客等级 码龄9年 27粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值