Python的装饰器详情介绍

目录
  • 1.定义及使用
  • 2.@classmethod

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装饰器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python装饰器实现函数运行时间的计算

    目录 个人理解 例子:调用函数的同时对函数进行计时 实现方法1:@语法糖 代码: 实现结果: 实现方法2:闭包 代码: 实现结果: 实现方式1和 2的差异 总结 个人理解 装饰器: 通过闭包和将一个函数作为另一个函数参数的形式,实现已有功能的灵活调用 例如: 首先设置了一个time_master的计时器函数,在运行某个函数的同时,用来统计函数的耗时 那么,如果想知道函数性能, 每次写完新的函数后,都放到time_master函数中运行一次来统计. ——> 这是比较麻烦的.相当于虽然有了一个称,但

  • Python的闭包和装饰器你真的了解吗

    目录 闭包 装饰器 总结 闭包 闭包就是能够读取其他函数内部变量的函数. def test1(k, b): def test1_1(x): print(k*x+b) return test1_1 t1 = test1(1, 2) t1(0) t1(1) t1(2) 闭包中修改数据 x = 300 def test1(): x = 200 def test2(): nonlocal x print("----1----x = {}".format(x)) x = 100 print(&q

  • Python函数装饰器的使用详解

    目录 装饰器 装饰器的定义 装饰器的意义 装饰器的使用 无参装饰器 有参装饰器 实例练习 总结 装饰器 装饰器的定义 关于装饰器的定义,我们先来看一段github上大佬的定义: Function decorators are simply wrappers to existing functions.In the context of design patterns,decorators dynamically alter the functionality of a function, met

  • python中的迭代器,生成器与装饰器详解

    目录 迭代器 生成器 装饰器 总结 迭代器 每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代. for循环调用list本质上是是调用了list的迭代器进行迭代. # 对list进行for循环本质上是调用了list的迭代器 list = [1,2,3,4] # for 循环调用 for elem in list: print(elem) # 迭代器调用 list_iter = list.__iter__() while True: tr

  • python三大器之迭代器、生成器、装饰器

    目录 迭代器 生成器 装饰器(非常实用!) 迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值).可迭代对象(iterable):是指该对象可以被用于for…in…循环,例如:集合,列表,元祖,字典,字符串,迭代器等. 在python中如果一个对象实现了 __iter__方法,我们就称之为可迭代对象,可以查看set\list\tuple…等源码内部均实现了__iter

  • python总结之闭包和装饰器

    目录 一.装饰器 1. 装饰器的简单介绍 2. 装饰器的解析过程 二.闭包 三.闭包中nonlocal语句的使用 1. 外部变量的引用和改写 2. nolocal的使用及特点 四.闭包与装饰器 五.闭包的作用 六.几个小栗子 栗子1: 栗子2: 栗子3 七.特殊的装饰器 property 装饰器 1. 我们为什么需要用到property 2. 使用Getters和Setters 3. property的作用 4. 小栗子 staticmethod装饰器和classmethod装饰器 step1:

  • python的迭代器,生成器和装饰器你了解吗

    python 迭代器与生成器,装饰器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器有两个基本的方法:iter() 和 next(). 字符串,列表或元组对象都可用于创建迭代器: list1=[1,2,3] s=iter(list1) # 创建迭代器对象 print(next(s)) # 输出迭代器的下一个元素 print(next(s)) print(next(s)) 直到计算出最后一个元素,没有更多的元素时,抛出StopIteration的错误 迭代器对象可以使用

  • Python装饰器中@property使用详解

    目录 最初的声明方式 使用装饰器的声明方式 使用装饰器的调用过程 总结 最初的声明方式 在没有@property修饰的情况下,需要分别声明get.set.delete函数,然后初始化property类,将这些方法加载进property中 class C持有property的实例化对象x 对外表现出来C().x时,实际上是调用C()中的x(property类)中设置的fset,fget,fdel,分别对应getx,setx,delx C真正持有的x,是self._x被隐藏起来了 class C(o

  • Python的装饰器详情介绍

    目录 1.定义及使用 2.@classmethod 1.定义及使用 例1:装饰器定义: def 装饰器函数(外部函数):            def 内联函数(*args,**kwargs):                ...前置装饰...                外部函数(*args,**kwargs)                ...后置装饰...            return 内联函数  例2:装饰器两种调用方式 第一种:装饰器函数(外部函数)(参数1,参数2....

  • Python装饰器详情

    目录 1.装饰器 1.1 应用场景 2.万能装饰器 3.多层装饰器 4.带参数的装饰器 1.装饰器 装饰器(Decorator):从字面上理解,就是装饰对象的器件.可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出. 装饰器的特点是特点是函数是作为其参数出现的,装饰器还拥有闭包的特点. 示例代码如下所示: # 定义一个装饰器 def decorate(func): def wrapper(): func() print("已将学生加入学校学生名单")

  • Python各种类型装饰器详细介绍

    目录 装饰器说明 装饰器分类 最简单的装饰器 用于修改对象的装饰器 用于模拟对象的装饰器--函数装饰器 用于模拟对象的装饰器--类方法装饰器 用于模拟对象的装饰器--类装饰器 特殊应用的装饰器 类实现的装饰器 装饰带参数/返回值的对象 装饰器带参数 装饰器应用 装饰器说明 Python中的装饰器是一种可以装饰其它对象的工具.该工具本质上是一个可调用的对象(callable),所以装饰器一般可以由函数.类来实现.装饰器本身需要接受一个被装饰的对象作为参数,该参数通常为函数.方法.类等对象.装饰器需

  • Python property装饰器使用案例介绍

    目录 1.property 2.property属性定义的两种方式 3.案例 1.property 装饰器:装饰器是在不修改被装饰对象源代码以及调用方式的前提下为被装饰对象添加新功能的可调用对象 property是一个装饰器,是用来绑定给对象的方法伪造成一个数据属性 装饰器property,可以将类中的函数“伪装成”对象的数据属性,对象在访问该特殊属性时会触发功能的执行,然后将返回值作为本次访问的结果. 使用property有效地保证了属性访问的一致性.另外property还提供设置和删除属性的

  • Python函数装饰器实现方法详解

    本文实例讲述了Python函数装饰器实现方法.分享给大家供大家参考,具体如下: 编写函数装饰器 这里主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. class tracer: def __init__(self,func): self.calls = 0 self.func = func def __call__(self,*args): self.calls += 1 print('call %s

  • Python自定义装饰器原理与用法实例分析

    本文实例讲述了Python自定义装饰器原理与用法.分享给大家供大家参考,具体如下: 什么是装饰器?装饰器本质是一个函数,它可以在不改变原来的函数的基础上额外的增加一些功能.如常见的@classmethod,@staticmethod等都是装饰器,接下来记录下如何自定义个装饰器: 刚刚说过了,装饰器的本质就是一个函数,所有想要自定义一个装饰器,首先自定义一个函数 def decorate(func): def wrapper(*args,**kwargs): print("定义一个装饰器"

  • python @propert装饰器使用方法原理解析

    这篇文章主要介绍了python @propert装饰器使用方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问.propert可以有两种用法:可以把一个方法变成只读属性:可以对一些属性进行过滤. 想象这样一个场景,在实例化一个类之后,需要对类的一个属性进行赋值,这时候是没有对属性属性被赋予的值进行判断的,如果属性被赋予了一个不合适的值,那么代码在后面执行的时候就会

  • Python @property装饰器原理解析

    这篇文章主要介绍了Python @property装饰器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.通过@property装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对"()"小括号. class Person: def __init__(self, name): self.__name = name @property def say(self): return self.__name xioabai

  • Python pytest装饰器总结(实例详解)

    几个常用装饰器 pytest.ini 配置文件 例子: [pytest] addopts = -v -s --html=py_test/scripts/report/report.html -p no:warnings --reruns=10 testpaths = ./py_test/scripts python_files= test_rerun.py python_classes = Test* python_function = test* xfail_strict = true add

  • Python函数装饰器的使用教程

    典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过自由变量绑定后,调用函数并返回结果. 使用clock装饰器: import time from clockdeco import clock @clock def snooze(seconds): time.sleep(seconds) @clock def factorial(n): return 1 if n < 2 else n*factorial(n-1) if _

随机推荐