• Python基础入门篇【32】--面向对象:装饰器与类的常用装饰器


    前言
    作者简介:短尾巴小鳄鱼 ,一位不放弃自己的上进卷妹
    💬 如果文章知识点有错误的地方,请留言指正~和大家一起学习,一起进步
    💬 人生格言:昨日种种,皆成今我。今日种种,方成新我。切莫踌躇,莫停留,莫沉溺💬
    如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦

    python装饰器与类的常用装饰器

    python中的装饰器

    什么是装饰器

    • 装饰器也是一种函数
    • 可以接受函数作为参数
    • 可以返回函数
    • 接收一个函数,内部对其处理,然后返回一个新函数,动态的增强函数功能

    比如,a函数是一个装饰器,将c函数在a函数中执行,在a函数中可以选择执行或不执行c函数,也可以对c函数的结果进行二次加工处理。

    被装饰器装饰的函数不直接调用,而是作为一个参数传入装饰器中。

    # 下面是一个装饰器,一个装饰器包含外围函数和内嵌函数
    def out(func_args):    # 外围函数
        def inter(*args, **kwargs):  # 内嵌函数,所有的业务都在内嵌函数中
            return func_args(*args, **kwargs)
        return inter  外围函数返回内嵌函数
    
    • 1
    • 2
    • 3
    • 4
    • 5

    装饰器的用法

    普遍使用第二种方法

    用法一:将被调用的函数直接作为参数传入装饰器的外围函数括弧内

    例子:

    # 下面是一个装饰器
    def a(func):
        def b(*args, **keargs):
            return func(*args, **kwargs)
        return b
    
    def c(name):
        print(name)
        
    a(c)('xiaoming')  # 将c函数放入装饰器a中执行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行结果如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yCbb1G63-1658999339574)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728152329136.png)]

    用法二:将装饰器与被调用函数绑定在一起,@符号+装饰器函数放在被调用函数的上一行,被调用的函数正常定义,只需要直接调用被执行函数即可

    def a(func):
        def b(*args, **kwargs):
            return func(*args, **kwargs)
    
        return b
    
    @a       # 将c函数与装饰器a绑定
    def c(name):
        print(name)
    
    c('xiaoming')  # 调用c函数时,将作为参数传入装饰器执行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果与上面用法一一样

    下面看一个例子帮助深入理解装饰器:

    对函数的返回值进行检查:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ztjmiq8u-1658999339577)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728153343432.png)]

    类的装饰器

    装饰器classmethod

    将类函数可以不经过实例化而直接被调用

    用法:

    @classmethod
    def func(cls,...):  # 注意,添加了这个装饰器,参数self需替换成cls,代表操作的是当前类
        do
    
    • 1
    • 2
    • 3

    例子:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IeuAQiad-1658999339578)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728155826760.png)]

    在classmethod装饰的类函数内部是不可以调用self的类函数的,但在self类函数内部可以调用classmethod装饰的类函数:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PrANbu17-1658999339579)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728161101897.png)]

    装饰器staticmethod

    将类函数可以不经过实例化而直接被调用,被该装饰器调用的函数不许传递self或cls参数,且无法在该函数内部调用其他类函数或类属性

    用法:

    @staticmethod
    def func(...):  # 注意,添加了这个装饰器,参数无self和cls
        do
    
    • 1
    • 2
    • 3

    例子:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwpwcMzA-1658999339580)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728165750844.png)]

    装饰器property

    将类函数的执行免去括弧,类似于调用属性

    用法:

    @property
    def func(self): 
        do
    
    • 1
    • 2
    • 3

    例子:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ydHxKqKX-1658999339581)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220728170757418.png)]

  • 相关阅读:
    LVS+Keepalived群集
    Go 1.22 中的 For 循环
    HTML+CSS+JS制作炫酷特效代码
    PCR/qPCR研究:Lumiprobe丨dsGreen 用于实时 PCR
    如何重定向注册表
    Day 40 Web容器-Tomcat
    vue项目切换页面白屏不显示解决方案
    【matplotlib】matplotlib的颜色表
    【独家】MobaXterm v22.1 全能终端连接工具中文版最新版
    如何区分与解决Redis的缓存雪崩、击穿与穿透问题
  • 原文地址:https://blog.csdn.net/weixin_44629511/article/details/126039402