千家信息网

如何使用Python的装饰器

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,这篇文章将为大家详细讲解有关如何使用Python的装饰器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.定义及使用例1:装饰器定义:def 装饰器函数(外部函数)
千家信息网最后更新 2025年11月11日如何使用Python的装饰器

这篇文章将为大家详细讲解有关如何使用Python的装饰器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1.定义及使用

例1:装饰器定义:

def 装饰器函数(外部函数):
def 内联函数(*args,**kwargs):
...前置装饰...
外部函数(*args,**kwargs)
...后置装饰...
return 内联函数

例2:装饰器两种调用方式

  • 第一种:装饰器函数(外部函数)(参数1,参数2......)

  • 第二种:定义时通过 @装饰器函数名 绑定 外部函数(外部函数调用时触发)

# coding:utf-8:if __name__ == '__main__':    # 例1 装饰器定义    # 装饰器函数 外部函数func    def decorator(func):        # 内联函数 进行装饰        # *args 将 参数1,参数2...... 变为 (参数1,参数2.......)        # **kwargs 将 参数3=参数值3,参数4=参数值4...... 变为 {'参数3':参数值3,'参数4':'参数值4'......}        # *args,**kwargs 将 参数1,参数2......参数3=参数值3,参数4=参数值4...... 变为 (参数1,参数2.......),{'参数3':参数值3,'参数4':'参数值4'......}        def inline(*args, **kwargs):            # *args,**kwargs 将参数还原            # 将 (参数1,参数2.......),{'参数3':参数值3,'参数4':'参数值4'......} 变为 参数1,参数2......参数3=参数值3,参数4=参数值4......            name = func(*args, **kwargs)            print(f'name is {name}')        # return 内联函数        return inline    def talk(name):        return name    # 例2 装饰器的两种调用方式    # 第一种 装饰器函数(外部函数)(参数1,参数2......)    decorator(talk)('xie')  # name is xie    # 第二种 @装饰器函数名 绑定 外部函数    @decorator    def see(name):        return name    # 调用时触发装饰器    see('xie')  # name is xie

2.@classmethod

  • 1.被@classmethod装饰的类方法可以通过class.方法(参数1,参数2......)调用

  • 2.但是定义函数时 self 需要变成 cls

  • 3.其内部不能调用类的普通方法(无装饰器修饰的方法),可以调用@classmethod,@staticmethod装饰的方法

  • 4.能访问类的属性

  • 5.普通类中能通过self调用@classmethod装饰的方法

# coding:utf-8:if __name__ == '__main__':    class A(object):        __name = 'python'        # 普通方法        def talk(self):            print(self.__name)            # self.see() 普通类中能通过self调用@classmethod装饰的方法        # 被@classmethod装饰的类方法可以通过class.方法(参数1,参数2......)调用        # 但是定义函数时 self 需要变成 cls        @classmethod        def see(cls, description='good'):            # cls.talk() Error 不能调用类的普通方法(非@classmethod,@staticmethod修饰的方法)            # cls.look() 可以调用@classmethod装饰的方法            # cls.jump() 可以调用@staticmethod装饰的方法            # 能访问类的属性            print(f'{cls .__name} is {description}')        @classmethod        def look(cls):            print(f'I like {cls.__name}')        @staticmethod        def jump():            print(f'I am jump')    a = A()    a.talk()  # python    # A.talk() Error 不能通过class.方法(参数1,参数2......)调用    a.see()  # python is good    # 通过class.方法(参数1,参数2......)调用    A.see()  # python is good

@staticmethod

  • 1. 被@staticmethod装饰的类方法可以通过class.方法(参数1,参数2......)调用

  • 2. 但是定义函数时 无须self和cls

  • 3. 由于其无self,cls注定其无法访问类属性&调用类方法

  • 4. 在类的普通方法中可以通过self调用@staticmethod装饰的方法

# coding:utf-8:if __name__ == '__main__':    '''      '''    class B(object):        __name = 'php'        def talk(self):            # 可以通过self调用@staticmethod装饰的方法            self.see(self.__name)        # 无须self,cls        @staticmethod        def see(description='good'):            print(f'description is {description}')    B.see()  # description is good    B.see('ok')  # description is ok    B().talk()  # description is php

@property

  • 1.@property装饰的函数被用来代替类中与函数名相同的属性

定义: @property
def 属性名(self):
.......

  • 2.被@property装饰器代替的属性,无法通过object.属性名=属性值进行赋值(除非使用了@属性名.setter装饰器):

定义: @属性名.setter
def 属性名(self,属性值):
......

  • 3.被@property修饰的函数不能在外部通过object.函数名()调用,只能object.函数名 当做属性

  • 4.只有被@property代替了的属性才能使用@属性名.setter 装饰器

  • 5. __setattr__ 的优先级高于 @属性名.setter装饰器的优先级

# coding:utf-8:if __name__ == '__main__':    '''       '''    class A(object):        __name = 'python'        sex = 'man'        # 不能设置成私有        # @property装饰的函数被用来代替类中与函数名相同的属性        # 这个代替了name属性        @property        def name(self):            return self.__name

@property

def sex(self):            return 'woman'        # 解决被替代属性的 object.属性=属性值 赋值问题        # 配合@property装饰器使用,只有被@property代替了的属性才能使用@属性名.setter 装饰器        @name.setter        def name(self, value):            print(f'value is {value}')        # __setattr__ 的优先级高于 @属性名.setter装饰器的优先级        # def __setattr__(self, key, value):        #     print(f'key is {key}, value is {value}')    a = A()    print(a.name)  # python    # print(a.name()) Error 被@property修饰的函数不能在外部通过object.函数名()调用,只能object.函数名 当做属性    # 被@property代替了    print(a.sex)  # 是 woman 不是 man    # a.sex = 'man' Error 被代替的属性,不能通过object.属性名 = 属性值 进行赋值,除非有@属性名.setter装饰    a.name = 'python3.7'  # value is python3.7

关于"如何使用Python的装饰器"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

参数 函数 属性 方法 普通 可以通过 优先级 utf-8 篇文章 相同 只有 方式 更多 不错 实用 内容 文章 知识 问题 无装 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 旅游网站需要多少服务器 邯郸置家网络技术有限公司 提醒孩子注意网络安全 数据合规与网络安全 bse软件开发 网络安全监察小组组长 广东专业软件开发公司 管理系统软件开发服务方案费用 数据库每天删除记录 怎么下载世界银行数据库中的数据 国家网络安全学院就业方向 视觉设计软件开发 无主题软件开发 河南悦如网络技术有限公司简介 特色班会课教案网络安全 数据库怎么在表中添加一列 山西美亚互联网众创科技 元亨证通网络技术人才服务 互联网加大赛超体科技 初级中学网络安全知识竞赛试题 电脑网络安全趋势 数据库怎么修改上传上限 qq注册不了网络安全 hp 服务器光盘启动 木瓜互联网科技幻想儿童画 2020年网络安全法宣传 昆明第三方软件开发零售价格 数据库安全的四个级别 阿里云服务器负责网络安全么 晋城市爱窝网络技术有限公司
0