一篇文章读懂Python装饰器

欢迎关注微信公众号“Python小灶,和我一起每天学习Python新知识”
不积跬步,无以至千里;不积小流,无以成江海。每天进步一点点,也是很大的进步。
在这里插入图片描述





一、什么是装饰器

在这里插入图片描述
这是我从官方文档接下来的图,虽然现在官方文档已经有中文版了,但是众所周知,中文文档是需要翻译的。



二、别给老夫讲原理,老夫写代码就是一把梭

观众老爷可能不满了,这都是啥,还是不明白。
别急,下面举两个简单的栗子就明白了。
简单来讲,装饰器就是在不改变原有代码结构的基础上,添加新功能。
示例:现在想在打印“Hello World”之前想再打印个"Hello Python"

def fun():
    print("Hello World")


if __name__ == "__main__":
    fun()

这个例子可能举的不是太好,可能比较机智的同学已经忍不住冷笑了。

def fun():
    print("Hello World")


if __name__ == "__main__":
    print("Hello Python")
    fun()

当然,你知道我不是这个意思,所以我们来个实际点的例子:
(当函数多、功能复杂的时候,上面那个方法不好使,特别容易污染工程代码,而且我这是举的最简单的例子,大部分函数是为了实现某一功能,是比较复杂的)
想在要在每一个函数的开头和结尾分别加上:这是函数XX的开头以及这是函数XX的结尾

def fun1():
    print("这是函数{}的主体".format(fun1.__name__))


def fun2():
    print("这是函数{}的主体".format(fun2.__name__))


if __name__ == "__main__":
    fun1()
    fun2()

# 这是函数fun1的主体
# 这是函数fun2的主体

那么如何实现

def a_decorator(fun):
    def wrapTheFunction():
        print("这是函数{}的开头".format(fun.__name__))
        fun()
        print("这是函数{}的结尾".format(fun.__name__))

    return wrapTheFunction


@a_decorator
def fun1():
    print("这是函数{}的主体".format(fun1.__name__))


@a_decorator
def fun2():
    print("这是函数{}的主体".format(fun2.__name__))


if __name__ == "__main__":
    fun1()
    fun2()

# 这是函数fun1的开头
# 这是函数wrapTheFunction的主体
# 这是函数fun1的结尾
# 这是函数fun2的开头
# 这是函数wrapTheFunction的主体
# 这是函数fun2的结尾

恭喜,你已经学会了装饰器,当然你可能发现了一点问题,就是打印不太对劲,这里的函数被warpTheFunction替代了。它重写了我们函数的名字和注释文档(docstring)。我举得例子因为刚好用到函数名,其实如果不需要用到函数名的装饰器不需要关注这个,如果一定要用到,解决办法就是那就是 functools.wraps

from functools import wraps


def a_decorator(fun):
    @wraps(fun)
    def wrapTheFunction():
        print("这是函数{}的开头".format(fun.__name__))
        fun()
        print("这是函数{}的结尾".format(fun.__name__))

    return wrapTheFunction


@a_decorator
def fun1():
    print("这是函数{}的主体".format(fun1.__name__))


@a_decorator
def fun2():
    print("这是函数{}的主体".format(fun2.__name__))


if __name__ == "__main__":
    fun1()
    fun2()


# 这是函数fun1的开头
# 这是函数fun1的主体
# 这是函数fun1的结尾
# 这是函数fun2的开头
# 这是函数fun2的主体
# 这是函数fun2的结尾

怎么样,是不是简单又有趣又实用,你学废了吗?



三、知其然,也想知其所以然

接下来我就给各位观众老爷翻译翻译,什么叫装饰器。

  • 装饰器是一个函数;
  • 函数都有返回值,装饰器的返回值也是函数;
  • 装饰器语法是一种语法糖(一种封装)。


    怎么来理解上述内容?,还是以上面示例为例。
    在Python中,一切皆是对象,变量是,函数也是,所以函数可以作为参数传递,也可以当成返回值。
    带着这个认知,我们去看看装饰器发生了什么(顺序1234)。

# 2、函数走到这里,a_decorator里定义了wrapTheFunction
# 但是只是定义,没有调用,整个a_decorator返回wrapTheFunction
def a_decorator(fun):
    def wrapTheFunction():
        print("Hello Python")
        fun()

    return wrapTheFunction


def fun():
    print("Hello World")


# 1、调用a_decorator函数,并把fun作为参数传给它
# 注意,不能加(),否则直接就执行了
fun = a_decorator(fun)  # 3、把调用的结果wrapTheFunction赋值给fun
if __name__ == "__main__":
    fun()  # 4、fun()此时就等于运行 wrapTheFunction()

# Hello Python
# Hello World

把上述代码封装成如下形式,就是装饰器。

@a_decorator
def fun():
    print("Hello World")
    
if __name__ == "__main__":
    fun()

可能有些人对fun和fun()很困惑,其实很好理解,fun是指这个函数,fun()是指这个函数调用的结果。




四、进阶,带参数的装饰器

待补充



五、参考文献,资料

想了解的更详细,去看以下两篇文档哦。
Python进阶_装饰器
菜鸟教程_装饰器

<think>嗯,用户想一篇针对零基础用户的DIY主机显卡选购与安装教程,适合小红书风格。首先,我需要确定用户的需求是什么。零基础用户可能对电脑硬件了解不多,所以内容必须简单易懂,步骤清晰,避免使用专业术语,或者如果必须用的话,要解释清楚。 小红书风格通常比较活泼,图文并茂,注重美观和实用性的结合。所以教程里可能需要分步骤,用emoji或者符号来突出重点,可能还需要配图说明。不过用户现在可能只是需要文字内容,但可以建议他们添加图片的位置。 接下来,结构方面,可能需要分为几个部分:选购前的准备、显卡基础知识、选购要点、安装步骤、常见问题。每个部分要简明扼要,用简短的段落和列表形式呈现。 用户提到的引用内容里提到要检查硬件参数,比如硬盘使用时间,这可能是在购买二手显卡时需要注意的。所以可能需要提醒用户如何检查显卡是否为二手或假卡,比如查看金手指是否有磨损,使用软件检测使用时间等。 另外,用户可能还需要知道如何根据需求选择显卡,比如游戏、设计、办公等不同用途对应的显卡型号。需要推荐一些主流品牌,如NVIDIA和AMD,以及不同预算下的选择,比如入门级、中端、高端。 安装部分要详细但简单,可能需要分步骤,比如如何插入显卡,固定螺丝,连接电源线等。要提醒用户注意静电,安装前洗手或戴防静电手环,以及安装驱动的重要性。 还要考虑常见问题,比如显卡尺寸是否适合机箱,电源功率是否足够,兼容性问题等。可能需要用问答形式来解答,或者放在注意事项里。 最后,可能需要推荐一些工具或软件,比如GPU-Z检测工具,3DMark测试软件,让用户可以自己验证显卡的性能和状态。 在撰的时候,要使用亲切的语气,多用小标题、符号和分段,保持内容轻松易读。可能需要加入一些个人建议或小贴士,比如“学生党推荐型号”或者“性价比之选”之类的标签,符合小红书的风格。 还要注意用户提到的引用内容中的检查硬盘使用时间,可能这里需要类比到显卡的检查方法,比如使用软件查看显卡的出厂日期和使用时长,避免买到翻新卡。 总之,结构大致是:吸引人的开头(如“小白必看!”),选购前的准备(预算、需求、兼容性),显卡基础知识(品牌、型号、参数),选购要点(新旧鉴别、散热、售后),安装步骤(图文),常见问题,结尾鼓励行动。每个部分用emoji或符号装饰,让版面更活泼。</think># 零基础也能看懂!DIY主机显卡选购&安装指南🎮✨ ## 🌈 **Step1 确定需求,拒绝迷茫** 1️⃣ **用途决定性能** - **学生党追剧/办公**:核显够用,省下显卡钱买奶茶不香吗? - **1080P游戏玩家**:$500-1500元显卡(如NVIDIA GTX 1660/RTX 3050) - **4K设计/3A大作**:$3000元以上显卡(如RTX 4070/RX 7900XT) 2️⃣ **检查硬件兼容性** - **电源功率**:显卡功耗+100W=电源额定功率最低值❗️(例:200W显卡需550W电源) - **机箱尺寸**:用卷尺量显卡位长度,超长显卡可能“塞不进”[^1] --- ## 🛒 **Step2 显卡选购避坑指南** ### 🔍 **参数怎么看?** | 参数 | 小白解读版 | |----------|-----------------------------------| | 显存容量 | 数字越大,能同时加载的游戏贴图越多👉6G起步 | | 核心频率 | 数字越大性能越强,但发热也会增加🌡️ | ### ⚠️ **二手卡鉴别技巧** 1. 查看显卡金手指:有明显划痕可能是矿卡 2. 下载GPU-Z软件:核对型号与官网参数是否一致 3. 要求卖家拍摄视频:展示显卡正常点亮过程 --- ## 🛠️ **Step3 手把手安装教程** **工具准备**:十字螺丝刀+防静电手环(可用摸金属门框代替) ### 📌 **安装6步法** 1. 机箱侧板拆开,找到PCIe插槽(最长的那条) 2. **↓按住插槽尾部卡扣**,对齐显卡金手指 3. **→水平插入**直到听见“咔哒”声 4. 用螺丝固定显卡挡板(防止晃动) 5. 连接显卡供电线(注意卡扣方向!) 6. 开机后安装官网驱动👉NVIDIA/AMD官网都有傻瓜包 ```python # 举个栗子:检查显卡是否识别(非代码实操) 设备管理器 → 显示适配器 → 出现显卡型号 ✅ ``` --- ## ❓ **常见Q&A** **Q:显卡风扇不转是坏了吗?** A:低负载时可能停转,用甜甜圈软件测试才会全速转动哦~ **Q:装机后屏幕不亮?** A:优先检查这3处: 1. 显示器线是否插在显卡接口(非主板接口!) 2. 显卡供电线是否完全插入 3. 内存条是否松动 --- ## 📍 **小红书风格小贴士** 🔥 **文案加分项**: - 实物图+标注关键部位(如供电接口、散热风扇) - 用“学生党闭眼入”“颜值天花板”等标签 - 结尾加话题 #DIY装机 #显卡攻略 #数码科技 💡 **避雷提醒**: “别被商家‘高性能独显’话术骗了!可能是十年前的亮机卡”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值