美文网首页
装饰器 函数/类实现方式即参数问题

装饰器 函数/类实现方式即参数问题

作者: 领悟悟悟 | 来源:发表于2018-07-12 15:10 被阅读0次

无参装饰器

  • 函数式
def outer(func):
    print('函数outer')
    def inner(*args, **kwargs):
        print('函数inner')
        return func(*args, **kwargs)
    return inner

@outer
def work(a,b):
    print('函数work')
    print('参数是:\t',a,'\t',b)
    return a+b
print()
print('work(1,5)' , work(1,5))

结果:
函数outer

函数inner
函数work
参数是:     1   5
work(1,5) 6

执行顺序:

outer(work)(1,5)
work = outer(work) 即 work 指向inner, 参数func指向原work

  • 类式
class Outer:
    def __init__(self, func):
        print('函数__init__')
        self.func = func

    def __call__(self, *args, **kwargs):
        print('函数__call__')
        return self.func(*args, **kwargs)

@Outer
def work(a,b):
    print('函数work')
    print('参数是:\t',a,'\t',b)
    return a+b
print()
print('work(1,5)' , work(1,5))

结果:
函数__init__

函数__call__
函数work
参数是:     1   5
work(1,5) 6

执行顺序:

outer(work)(1,5)
work = Outer(work) work指向Outer的实例化对象,对象的func属性指向work

有参装饰器

  • 函数式
def outer(param):
    def middle(func):
        print('param:',param)
        def inner(*args, **kwargs):
            return func(*args, **kwargs)
        return inner
    return middle

@outer(5)
def work():
    print('work')

work()
输出:
param: 5
work

执行顺序

outer(5)(work)()

  • 类式
class Outer:
    class Inner:
        def __init__(self, func):
            self.func = func

        def __call__(self, *args, **kwargs):
            print('param', self.param)
            return self.func(*args, **kwargs)
    
    def __init__(self, param):
        self.param = param

    def __call__(self, *args, **kwargs):
        inner = self.Inner(*args, **kwargs)
        inner.param = self.param
        return inner

@Outer(5)
def work():
    print('work')

work()

输出:
param 5
work

执行顺序

Outer(5)(work)()
@Outer(5) Outer(5)执行之后的结果要是一个可执行的函数,
类有 __call__() 方法可以Outer(5)(work)

def outer(param):
    def middle1(param):
        def middle2(func):
            def inner(*args, **kwargs):
                print(param)
                func(*args, **kwargs)
            return inner
        return middle2
    return middle1

#@outer(6)(5) 不支持
def work():
    print('work')

# 这样写是可以的
work = outer(6)(5)(work)
work()

输出:
5
work

相关文章

  • 装饰器 函数/类实现方式即参数问题

    无参装饰器 函数式 执行顺序: outer(work)(1,5)work = outer(work) 即 work...

  • Python基础28-面向对象(系统内置方法8-装饰器)

    8 装饰器 1 装饰器(函数式实现) 2 通过类方式,实现装饰器 通常装饰器使用 使用@check 方式实际上就是...

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • 装饰器

    装饰器 decorator类装饰器 带参数的装饰器 举例(装饰器函数;装饰器类;有参与无参) https://fo...

  • TypeScript——装饰器(四)

    参数装饰器 参数装饰器声明在一个参数声明之前(紧靠着参数声明)。 参数装饰器应用于类构造函数或方法声明。 参数装饰...

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • Python学习打call第七十六天:封装mock

    1.patch装饰器的概念 patch装饰器是mock第二种实现数据模拟的方式,patch()充当函数装饰器,类装...

  • 装饰器

    一、函数传参 二、如果每个函数都需要同一个功能 三、装饰器实现 四、被装饰函数有参数情况 五、带参数的装饰器 六、...

  • 装饰器的使用

    函数带多个参数 普通的装饰器, 打印函数的运行时间 装饰器带有多个参数当装饰器带有多个参数的时候, 装饰器函数就需...

  • 实现单例的几种成熟设计模式

    装饰器方式 作为类装饰器,实现单例 改写new方式 可以被继承,子类也是单例 改写type元类方式实现 总结:元类...

网友评论

      本文标题:装饰器 函数/类实现方式即参数问题

      本文链接:https://www.haomeiwen.com/subject/mqqrpftx.html