千家信息网

如何使用Python的装饰器

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章将为大家详细讲解有关如何使用Python的装饰器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.定义及使用例1:装饰器定义:def 装饰器函数(外部函数)
千家信息网最后更新 2025年02月02日如何使用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安全错误 数据库的锁怎样保障安全 服务器装机操作流程 称重系统重装能不能连接服务器 网易版服务器如何防止外挂 steam查看服务器 数据库日志在c盘哪里 软件与应用技术和网络技术 幼儿园网络安全管理相关制度 网络数据库系统安全防护研究 刷卡手机无法连接到服务器 数据库一词起源 射击游戏服务器刷新率各是多少 网络技术岗位技能测试 恐龙岛晚上服务器推荐 甘肃人社人脸认证服务器配置 东驰网络技术公司 理解软件开发语言中的高级语言 推荐服务器超时退出时长 顺义区专业软件开发质量保障 IOS能不能用于服务器 广东云端服务器租用云空间 想从事软件开发报哪些大学 福建专升本关系数据库理论 学术论文的数据库 湖北质量软件开发推广 卫星定位服务器价格 日了狗了服务器 overlay网络技术研究 中国最大的软件开发交流平台 java 服务器通信安全 镇党委政府网络安全计划
0