学习
实践
活动
工具
TVP
写文章

python装饰2:类装饰

装饰1:函数装饰 装饰2:类装饰 装饰3:进阶 本文是装饰相关内容的第二篇,关于类装饰。 "类装饰"有两种解读方式:用来装饰类的装饰;类作为装饰装饰其它东西。 我的文章中是将"类装饰"解读为第一种方式,即装饰类的东西。而“类作为装饰装饰其它东西”,我都会为其标注"类作为装饰"或"作为装饰的类"以避免歧义。 类装饰的形式 函数装饰装饰函数(方法)的,类装饰装饰类的,它们的表现形式是一样的。 @decorator class cls: ... cls = decorator(cls) c = cls() 它的效果是创建实例对象的时候,会触发装饰中的代码逻辑。 但类装饰最终的目标是为了扩展类cls,所以在wrapper里必须得构造出cls的对象。上面采取的方式是通过cls()来构造cls对象,并放在wrapper对象的一个属性wrapped中。

45420

装饰

一、装饰的简单介绍 1 # /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 ''' 装饰 ''' 4 ''' 5 装饰的工作原理 当执行到outer函数的时候, 将其内容放入内存, 执行到f1的时候.在f1上发现@outer装饰. 8 3. 1 # /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 '''装饰_带有多个参数''' 4 5 #定义装饰的时候,带有两个参数*args, outer 15 def f1(a,b): 16 print("执行带参数的函数") 17 return a+b 18 19 r = f1(1,2) 20 print(r)  三、多个装饰装饰一个函数 1 # /usr/bin/env python 2 # -*- coding:utf-8 -*- 3 '''多个装饰装饰一个函数''' 4 5 def outer(func): 6

8920
  • 广告
    关闭

    2022腾讯全球数字生态大会

    11月30-12月1日,邀您一起“数实创新,产业共进”!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    装饰

    在主函数中不能直接调用嵌套函数里的子函数如:fun1(num),需要先调用嵌套中的母函数如:fun(),然后把fun()函数中的子函数fun1()的地址传递给一个变量,然后才可以直接调用子函数fun1 一下是装饰函数的标准模式 ,可以采用断点debug来一步步运行深入理解函数执行步骤 装饰编码思路:将新的函数地址赋值给旧的函数,调用旧函数时实际运行的是新函数,新函数中又会运行旧函数,从而达到装饰的作用 import time

    19910

    装饰

    n个参数的函数的装饰? return func(*args,**kwargs)     return inner   @w1 def f1(arg1,arg2,arg3):     print 'f1' 问题:一个函数可以被多个装饰装饰吗  func(*args,**kwargs)     return inner     @w1 @w2 def f1(arg1,arg2,arg3):     print 'f1' 问题:还有什么更吊的装饰吗 功能,即:装饰内的函数代指了原函数,注意其只是代指而非相等,原函数的元信息没有被赋值到装饰函数内部。 def function(): """ asdfasd :return: """ print('func') 无元信息 如果使用@functools.wraps装饰装饰内的函数

    7250

    装饰

    关于装饰: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原则:1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 二.实现装饰知识必备技能: 1.函数即“变量” 2. 高阶函数 a.把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码下为其添加功能) b.返回值中包含函数名(不修改函数的调用方式) 3.嵌套函数 高阶函数 +嵌套函数=》装饰 2.1函数即“ 随后在解释上输入func函数的函数名,这时会返回一串指针地址,在python中所有的对象都会对应的指针地址,即指向内存中func函数的位置。 三装饰初成 ? 四。装饰小成 以上的test只是刚好装饰没有返回值的函数,下面可以装饰存在返回值的函数 ? 五.装饰大成 此处模拟网站不同登陆方式的装饰,使用一个装饰,对不同的函数的附加不同的功能。 Home 函数使用密码登陆方式, bbs 函数使用另一种登入方式 ?

    44670

    装饰

    装饰就是让你在函数之前或者之后可以执行一段代码。 现在你需要知道什么是装饰了,装饰就是在函数之前或者之后可以执行一段代码。 写你的第一个装饰 在上一个例子中,我们其实已经创建了一个装饰,让我们来修改一下变得更有用 def a_new_decorator(a_func): def wrapTheFunction( 这正是装饰在Python中所做的! 它们包装一个函数并以某种方式修改它的行为。 现在你可能想知道我们没有在我们的代码中使用任何@ 这只是构成装饰功能的简短方法。 类也可以用来构建装饰

    6210

    装饰

    def f2(func): #定义一个函数加参数,其中的func参数为装饰的函数体 def f3(w1,w2) #这个函数可以进行w1,w2参数 print("吴永聪") #输出吴永聪 ret = func(w1,w2) #装饰函数体的参数并将其赋给ret print("123") #输出123 return ret #返回 ret的值 return f3 #返回f3函数的参数 @f2 #@使用装饰 def f1(w1,w2): print("你好") return w1 + w2 w = f1(11,22) print(w)  解释:从上往下执行。

    17420

    python装饰1:函数装饰详解

    装饰1:函数装饰 装饰2:类装饰 装饰3:进阶 先混个眼熟 谁可以作为装饰(可以将谁编写成装饰): 函数 方法 实现了__call__的可调用类 装饰可以去装饰谁(谁可以被装饰) 函数可以同时被多个装饰装饰,后面的装饰以前面的装饰处理结果为基础进行处理: @decorator1 @decorator2 def func():... 可以定义一个函数装饰来增强函数f()。 所以,如有需要,直接使用__wrapped__去调用未被装饰的函数比较好。 另外,并不是所有装饰中都使用了@wraps。 带参数的函数装饰 函数装饰也是可以带上参数的。 其实带参数的函数装饰写起来有点绕:先定义一个带有参数的外层函数,它是外在的函数装饰,这个函数内包含了真正的装饰函数,而这个内部的函数装饰的内部又包含了被装饰的函数封装。

    23220

    Python高级编程-装饰1.装饰的理解2.多个装饰3.装饰(decorator)功能4.装饰示例

    1.装饰的理解 装饰是程序开发中经常会用到的一个功能,用好了装饰,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去了 ,然后面试问到了就挂了,因为装饰是程序开发的基础知识,这个都不会,别跟人家说你会Python,看了下面的文章,保证你学会装饰。 比如java中的动态代理,python的注解装饰 其实python的装饰,是修改了代码。 2.多个装饰 ? 运行结果: ? 3:被装饰的函数有不定长参数 ? 运行结果: ? 4:装饰中的return ? 此时timefun无返回值,运行结果: ? 如果修改装饰为return func(),则运行结果: ? 总结: ·一般情况下为了让装饰更通用,可以有return 5.装饰带参数,在原有装饰的基础上,设置外部变量 ? 运行结果: ?

    18520

    函数的装饰,两层装饰和三层装饰

    06.01自我总结 一.装饰 1.函数装饰圈的定义 函数装饰:一种装饰函数的函数 2.个人理解两层函数装饰 两层函数装饰个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头尾进行添加程序 ,但是不能减少他的程序内容,他的原来程序不变只能增不能减少,然后返回装饰好的子函数,再全局定义一个变量名与要装饰的函数名相同名字,并且将装饰后的函数调用赋予改变量. 1.简单的例子(无参函数) 如 #有个函数 def sb(*args,**kwargs): pass #装饰模板 def sb_deco(sb): def wrapper(*args,**kwargs): #sb 赋值的时候已经开始调用了所有没必要在写一步调用 return res return wrapper sb = sb_deco(sb) sb(1,23,2,3,12,312,312,3,123) 3.对于三层装饰理解 #比如说一个函数为,我们对齐装饰,打印内容前后上下加'-' def sb(): print('i am sb') #装饰 def sb_deco(sb): def wrapper

    32710

    TypeScript系列教程十一《装饰》 -- 属性装饰

    》 – 装饰与继承 TypeScript系列教程十一《装饰》 – 类装饰 TypeScript系列教程十一《装饰》 – 方法装饰 TypeScript系列教程十一《装饰》 – reflect-metadata TypeScript系列教程十一《装饰》 – 属性装饰 TypeScript系列教程十一《装饰》 – 参数装饰 属性装饰和其他装饰功能类似,其设计也是为了统一的、复用度更高的去监听,改变属性 属性装饰声明在一个属性声明之前(紧靠着属性声明)。 属性装饰不能用在声明文件中(.d.ts),或者任何外部上下文(比如 declare的类)里。 注意  属性描述符不会做为参数传入属性装饰,这与TypeScript是如何初始化属性装饰的有关。 代码目的: 根据工厂装饰key,返回json,在网络请求的时候经常会占用关键字,根据工厂装饰key确定json 属性最终名称。

    20420

    TypeScript系列教程十一《装饰》 -- 类装饰

    装饰定义 首先看下类装饰在TS中的定义: 是一个函数 函数的参数是一个继承函数类型的泛型函数 返回可以是一个装饰函数或者不返回(工厂模式返回函数后面介绍) declare type ClassDecorator 装饰相同的道理,只需要实现这个装饰即可,下面用代码实现。 类装饰其实就是一个语法糖,类装饰相当于一个函数,函数的参数是类构造函数。 有些装饰需要参数判断情况,比如学生和艺术家都能弹钢琴,但是弹的曲目不一样,那么需要带参数判断,工厂根据参数创造出装饰返回。 函数嵌套,先执行后面的装饰,当后面的装饰执行完,才执行前面的。

    17530

    TypeScript系列教程十一《装饰》 -- 参数装饰

    》 – 装饰与继承 TypeScript系列教程十一《装饰》 – 类装饰 TypeScript系列教程十一《装饰》 – 方法装饰 TypeScript系列教程十一《装饰》 – reflect-metadata TypeScript系列教程十一《装饰》 – 属性装饰 TypeScript系列教程十一《装饰》 – 参数装饰 参数装饰修饰函数参数,一般应用场景配合方法装饰一起,达到检查参数的目的。 参数装饰表达式会在运行时当作函数被调用,传入下列3个参数: 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。 成员的名字。 -参数在函数参数列表中的索引。 下面通过例子具体查看。 代码示例 示例目的: 根绝参数找到返回的值,然后利用方法装饰返回处理后的结果。 代码思路 根据参数装饰标识 通过reflect-metadata 将数据记载到方法元数据,然后传递到方法装饰 方法装饰调用原有方法返回值 代码实现 import "reflect-metadata

    11410

    Python装饰

    Python中装饰分为两大类: 函数装饰装饰 函数装饰 最简单的装饰 Python中最简单的装饰是一个嵌套函数。 类装饰装饰与函数装饰类似,只是类装饰中要实现__call__方法: class Elapsed: def __init__(self, func): self. __cls}' @LogClassName class Info: pass logging.info(Info) Info() Python中的装饰装饰模式 Python中的装饰装饰模式有着相同的目的 Python在语言层面对与装饰给与了支持,相对比较简洁,经典的装饰模式在编码实现上通常比Python装饰有更多的代码量。 Python装饰要明确的作用域某个函数或类上,装饰模式则是针对某种类型的方法做扩展,具体扩展的对象在运行时才确定。此外,装饰模式可以作为面向对象中继承的替代。

    11630

    TypeScript系列教程十一《装饰》 -- 方法装饰

    》 – 装饰与继承 TypeScript系列教程十一《装饰》 – 类装饰 TypeScript系列教程十一《装饰》 – 方法装饰 TypeScript系列教程十一《装饰》 – reflect-metadata TypeScript系列教程十一《装饰》 – 属性装饰 TypeScript系列教程十一《装饰》 – 参数装饰 方法装饰在后端编程中见到是比较多的,路由、注入等场景都有大规模的应用。 下面是开始学习TS的方法装饰。 示例思路: 实现一个get装饰 get装饰修饰函数可以拿到request 对象 request 对象是经过装饰处理塞进函数的 代码示例: const get:MethodDecorator = 方法装饰工厂类似于类装饰工厂,工厂加工产生的是方法装饰

    11020

    python2装饰_python内置装饰

    前言 我们都知道装饰的作用是在不改变原有的代码基础上,添加新的功能,但是这样会有一个弊端,被装饰的函数某些属性会变改变,接下来我们来看下 案例 import time def run_time (func): def wrapper(*args, **kwargs): """时间装饰""" time1 = time.time() func __doc__) """ 结果 # wrapper # 时间装饰 """ 可以看到,我们明明打印的是test函数的__name__属性,最后显示的却是run_time的属性。 我们知道@run_time装饰实际上就等于test = run_time(test),此时我们打印test. __name__实际上test已经指向了wrapper,这样会造成我们打印的时候会打印装饰的内嵌函数的名字和注释。

    8520

    装饰叠加

    在使用pytest+allure进行自动化脚本开发的时候,在case头部需要增加很多装饰才能使报告按照预期格式展示 例如我需要报告展示如下: ? title='这个test_b', issue=('url', '问题单:xxx')) def test_b(): print('ok') 为了实现这个目标,先来回忆一下装饰运行的方式 test_b')( allure.issue('url', '问题单:xxx')( test_b) ) ) ) 不过按照装饰的调用顺序的话 allure.feature('大模块')(test_b) ) ) ) 编写一个函数接受不定长的参数: def compose(**kwargs): pass 因为它要作为一个装饰 ZXTestFrame/blob/master/zxapi/utils/allureoperator.py # -*- coding:utf-8 -*- """ @Describe: 简化allure装饰头部

    27520

    Python装饰

    Python的装饰可以做一些类似Java SpringBoot AOP切面注解的事情。

    30420

    装饰模式

    装饰模式 装饰模式Decorator Pattern允许向一个现有的对象添加新的功能,同时又不改变其结构,这种类型的设计模式属于结构型模式,是作为现有的类的一个包装。 关联机制,即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,我们称这个嵌入的对象为装饰Decorator。 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,也就是说客户端并不会觉得对象在装饰前和装饰后有什么不同,装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。 Decorator: 抽象装饰类。 ConcreteDecorator: 具体装饰类。 优点 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰,从而实现不同的行为。 通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。

    28542

    Python 装饰

    装饰在Java中是一种设计模式。 装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。 装饰在Python中提供类似于注解使用方式,直接使用@装饰名就是调用已经写好的装饰对现有方法进行装饰,同时python语言已经内置了大量已经实现好的装饰装饰 装饰器用于在一个函数上添加一些额外的操作,比如日志、计时等固定操作,一定程度上可以实现切面编程。Python可以非常简单地使用@装饰名这种注解方式使用已经写好的装饰。 __annotations__ {'n': <class 'int'>} >>> 装饰类 Python不仅支持利用闭包实现装饰,也支持在类中实现装饰,实现了装饰的类可以被称作装饰类。 在一个类中实现内置的__call__()和__get__()两个内置方法,就实现了一个装饰类,并且能想装饰那样使用@加装饰名的方式使用,下面是一个来自python cookbook的示例: import

    7930

    扫码关注腾讯云开发者

    领取腾讯云代金券