Python的装饰器详情介绍

 更新时间:2022年03月01日 10:17:35   作者:Mar丶流年  
这篇文章主要介绍了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的装饰器详情介绍的文章就介绍到这了,更多相关Python装饰器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Python 函数参数的拆解

    详解Python 函数参数的拆解

    这篇文章主要介绍了Python 函数参数的拆解,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-09-09
  • caffe的python接口生成solver文件详解学习

    caffe的python接口生成solver文件详解学习

    这篇文章主要为大家介绍了caffe的python接口生成solver文件详解学习示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Python使用正则匹配实现抓图代码分享

    Python使用正则匹配实现抓图代码分享

    本文给大家分享的是个人的第一个作品,使用Python正则匹配实现抓图代码,非常的简单实用,推荐给大家,小伙伴们可以自由扩展下。
    2015-04-04
  • 如何解决import torchvision报错问题 DLL:找不到模块

    如何解决import torchvision报错问题 DLL:找不到模块

    这篇文章主要介绍了如何解决import torchvision报错问题 DLL:找不到模块,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Python打包成.exe可执行文件的详细步骤

    Python打包成.exe可执行文件的详细步骤

    在Python中,可以使用一些工具将Python代码打包成可执行文件(.exe)以便在没有安装Python解释器的环境中运行,本文通过图文结合的方式给大家详细介绍了Python打包成.exe可执行文件的步骤,需要的朋友可以参考下
    2024-04-04
  • Pycharm开发Django项目创建ORM模型的问题

    Pycharm开发Django项目创建ORM模型的问题

    ORM,全称Object Relational Mapping,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句,下面通过本文给大家介绍Pycharm开发Django项目ORM模型介绍,感兴趣的朋友一起看看吧
    2021-10-10
  • python装饰器简介---这一篇也许就够了(推荐)

    python装饰器简介---这一篇也许就够了(推荐)

    这篇文章主要介绍了python装饰器简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Pytorch教程内置模型源码实现

    Pytorch教程内置模型源码实现

    本文是关于Pytorch教程文章,本篇主要为教大家Pytorch内置模型源码实现,有需要的朋友可以借鉴参考下,希望可以有所帮助,祝大家多多进步,早日升职加薪
    2021-09-09
  • 彻底搞懂Python字符编码

    彻底搞懂Python字符编码

    本篇文章带领大家彻底搞懂Python字符编码的一些知识,及python字符编码的一些基础概念,需要的朋友可以参考下
    2018-01-01
  • Django 解决distinct无法去除重复数据的问题

    Django 解决distinct无法去除重复数据的问题

    这篇文章主要介绍了Django 解决distinct无法去除重复数据的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05

最新评论