首页 > 其他分享 >当被问到类装饰器,那么是指装饰类的装饰器,还是类本身作为装饰器来用?

当被问到类装饰器,那么是指装饰类的装饰器,还是类本身作为装饰器来用?

时间:2022-12-16 15:58:10浏览次数:46  
标签:__ 函数 args add func 问到 装饰 器来

装饰器

装饰器:写代码要遵循开放封闭原则,装饰器本质是一个嵌套函数(被套着的函数就是闭包),它可以让被装饰函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
加载顺序自下而上,执行顺序自上而下
@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name

# 装饰器的第一层函数被称为 外围函数 , 'func_args' 为要处理的函数
def out(func_args):
	# 外围函数的函数体内定义的函数被称为内嵌函数;传入的参数为要处理的func_args函数的参数
	# 这里我们并不知道 func_args 函数需要传入进来的参数是什么,所以目前写传入可变参数是比较合理的
    def inter(*args, **kwargs):
		# 在 内嵌函数 的函数体内调用 func_args 函数,并将可变参数传入
		# 其实这里我们可以处理更多的逻辑;
		# 我们可以选择执行或者不执行,甚至可以func_args 函数的执行结果进行二次处理
         return func_args(*args, **kwargs)
    # 书写完 内嵌函数的业务之后,我们在 外围函数体内返回 内嵌函数
    return inter             
# 需要注意的是,这里是不执行的(因为没有加括号),这是装饰器的定义规则,是必不可少的
# 只有外围函数返回内嵌函数,才可以被之后的代码执行;(因为所有的业务都在内嵌函数中,不返回就无法执行调用)

类装饰器

装饰类的装饰器

def auth(func):
    def inner(*args, **kwargs):
        res = func(*args, **kwargs)
        res.name='zxr'
        return res
    return inner
@ auth # Person = auth(Person)
class Person():
    pass
p = Person() # auth(Person)() --->返回的是inner()--->返回的是res(Person对象)

-特殊语法糖: Person=auth(Person)
        @auth 
        class Person
    -以后再使用 p=Person()  # auth(Person)()--->inner()---->最终返回的还是Person的对象,只是咱们可能加了一些东西

类本身作为装饰器来用

class Auth:
    # 类加()触发__init__
    def __init__(self, func):  # 将func(被装饰的对象)作为参数传入
        self.func = func  # self.func为被装饰的对象

    def __call__(self, *args, **kwargs):
        print('working here')
        res = self.func(*args, **kwargs)  # add(a, b)接受了俩个值
        return res
@Auth # add = Auth(add)
def add(a,b):  # add 是Auth的对象
    return a + b

res = add(4, 5)  # add加括号,会触发Auth的__call__
print(res)
'''
@Auth  # add=Auth(add)---->类()--->__init__(),执行完这个以后,add就是auth类加括号以后的对象,然后就会触发__call__
def add(a, b):
add 是谁? Auth的对象了,后期调用add()--->Auth对象()----->类的对象()--->__call__--->

''' 
	在某个类中多定义一个__call__方法,这样类作为装饰器装饰函数的时候,函数运行就会运行__call__方法中的内容,这就完成了类作为函数装饰器的作用了

from functools import wraps

class animal:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print('working here')
        res = self.func(*args, **kwargs)
        return res

@animal  # test = animal(test)
def test(name, kind):
    word = f'{name} belongs to {kind}'
    return word

A = test('cow','mammals')
print(type(test))
print(A)

'''
执行结果:
working here
<class '__main__.animal'>
cow belongs to mammals
'''
类作为一个装饰器,首先使用__init__将函数实例化,但查看type(test)发现test并不是一个函数,实例化func后,使用self.func即可在任意位置调用函数。但是在—__call__中定义方法才能够装饰到函数中,接下来使用return返回函数运行结果

标签:__,函数,args,add,func,问到,装饰,器来
From: https://www.cnblogs.com/zxr1002/p/16987561.html

相关文章

  • 类装饰器
    #类装饰器之:加在类上的装饰器#defauth(func):#definner(*args,**kwargs):#print("我要开始了")#res=func(*args,**kwargs)#......
  • 设计模式 学习目的 举例:装饰器模式和代理模式
    1.装饰器模式和代理模式  2.学习目的 ......
  • 装饰者模式案例
    在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。拿一个咖啡对象,以摩卡对象来装饰它,以奶泡对象来装......
  • CSS基础-装饰,基线,光标类型,边框圆角(胶囊),文字溢出,元素隐藏,边框合并,css画三角形
    CSS基础-装饰目录CSS基础-装饰1.1认识基线(了解)1.2文字对齐问1.3垂直对齐方式(拓展)项目中vertical-align可以解决的问题2.1光标类型3.1边框圆角3.2边框圆角的常见......
  • 极客编程python入门-装饰器
    装饰器在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。由于函数也是一个对象,而且函数对象可以......
  • Python之装饰器
    1.装饰器简介python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。简单的说装饰器就是......
  • CBV加装饰器的三种方式
    CBV如何加装饰器#先导包:fromdjango.utils.decoratorsimportmethod_decorator#方式一,加在某个具体的方法上,格式:@method_decorator(装饰器名字)#方式二,加在类上,格式......
  • Python学习基础笔记十九——装饰器
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • 彻底理解Python中的闭包和装饰器(上)
    什么是闭包闭包(Closure)其实并不是Python独有的特性,很多语言都有对闭包的支持。(当然,因为Python是笔者除C/C++之外学习的第二门语言,所以也是第一次遇到闭包。)简而言之,闭包实......
  • 彻底理解Python中的闭包和装饰器(下)
    上篇讲了Python中的闭包,本篇要讲的装饰器就是闭包的一个重要应用。如果你还不知道什么是闭包,猛戳这里阅读:彻底理解Python中的闭包和装饰器(上)什么是装饰器装饰器的作用是......