zoukankan      html  css  js  c++  java
  • Python 装饰器笔记

    一、装饰器无参数

    1.原函数无参数

    def wrap_in_tag_b(fn): # wrap_in_tag_b 是真正的装饰器
        def wrapped():
            return "<b>" + fn() + "</b>"
        return wrapped
    
    def wrap_in_tag_i(fn):
        def wrapped():
            return "<i>" + fn() + "</i>"
        return wrapped
    
    @wrap_in_tag_b
    @wrap_in_tag_i
    def hello():
        return "hello"
    
    print(hello()) # returns "<b><i>hello world</i></b>"

    2.原函数带参数

    def wrap_in_tag_b(fn):
        def wrapped(arg): # arg 是原函数参数
            return "<b>" + fn(arg) + "</b>"
        return wrapped
    
    def wrap_in_tag_i(fn):
        def wrapped(arg): # arg 是原函数参数
            return "<i>" + fn(arg) + "</i>"
        return wrapped
    
    @wrap_in_tag_b
    @wrap_in_tag_i
    def hello(name):
        return "hello {}".formar(name)
    
    print(hello('Jack')) 

    二、装饰器带参数

    1.原函数无参数

    def wrap_in_tag(deco_arg):
        # 装饰器参数:deco_arg
        # 可以在任意位置使用
        def real_decorator(func):  # real_decorator才是即将返回的真正的装饰器
        # 原函数参数:func_arg 
        # 只可以在此位置使用

        def wrapped() : return "<{0}>{1}</{0}>".format(deco_arg, func()) return wrapped return real_decorator @wrap_in_tag('b') @wrap_in_tag('i') def hello(): return "hello" print(hello())

    2.原函数带参数

    def wrap_in_tag(deco_arg):
        # 装饰器参数:deco_arg
        # 可以在任意位置使用
        def real_decorator(func):  # real_decorator才是即将返回的真正的装饰器
            def wrapped(func_arg):
                # 原函数参数:func_arg
                # 只可以在此位置使用
                return "<{0}>{1}</{0}>".format(deco_arg, func(func_arg))
            return wrapped
        return real_decorator
        
    @wrap_in_tag('b')
    @wrap_in_tag('i')
    def hello(name):
        return "hello {}".format(name)
        
    print(hello('Jack'))


    三、装饰器类

    1.原函数无参数

    class wrap_in_tag(object):
        def __init__(self, deco_arg):
            self.tag = deco_arg  # 装饰器参数:deco_arg
    
        def __call__(self, func):
            def newf(): # 原函数无参数
                return "<{0}>{1}</{0}>".format(self.tag, func())
            return newf
    
    @wrap_in_tag('b')
    @wrap_in_tag('i')
    def hello():
        return 'hello'
     
    print(hello())


    2.原函数带参数

    class wrap_in_tag(object):
        def __init__(self, deco_arg):
            self.tag = deco_arg # 装饰器参数:deco_arg
            
        def __call__(self, func):
            def newf(func_arg): # 原函数参数: func_arg
                return "<{0}>{1}</{0}>".format(self.tag, func(func_arg))
            return newf
    
    @wrap_in_tag('b')
    @wrap_in_tag('i')
    def hello(name):
        return "hello {}".format(name)
     
    print(hello('Jack'))

    四、用装饰器装饰类

    1.用函数作为装饰器

    def wrap_in_tag(deco_arg):
        def real_decorator(func):
            def wrapped(self, func_arg): # 类方法接收第一个参数都是self,这个必须有,而无论func_arg是否有!!!
                return "<{0}>{1}</{0}>".format(deco_arg, func(func_arg))
            return wrapped
        return real_decorator
    
    class foo(object):
        
        @wrap_in_tag('b')
        @wrap_in_tag('i')
        def hello(self, name):
            return 'hello {}".format(name)
        
        @wrap_in_tag('b')
        @wrap_in_tag('i')
        def byebye(self, name):
            return 'byebye {}".format(name)
        
    f = foo()
    print(f.hello('Jack')


        2.用类作为装饰器

    class wrap_in_tag(object):
        def __init__(self, deco_arg):
            self.tag = deco_arg
            
        def __call__(self, func):
            def newf(slf, func_arg): # slf必须!self被占用了,那就给第一个参数另一个名字slf(随便)
                return "<{0}>{1}</{0}>".format(self.tag, func(func_arg))
            return newf
            
            
            
    class foo(object):
        
        @wrap_in_tag('b')
        @wrap_in_tag('i')
        def hello(self, name):
            return 'hello {}".format(name)
        
        @wrap_in_tag('b')
        @wrap_in_tag('i')
        def byebye(self, name):
            return 'byebye {}".format(name)

    f = foo()
    print(f.hello('Jack'))
     
  • 相关阅读:
    UVa 1354 天平难题 (枚举二叉树)
    广西邀请赛总结
    UVa 12118 检查员的难题 (dfs判连通, 构造欧拉通路)
    UVA
    Uva 127 "Accordian" Patience (模拟)
    UVA 10539 Almost Prime Numbers( 素数因子)
    HDU 1272 小希的迷宫(并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 2236 Wireless Network(并查集)
    HDU 1233 还是畅通工程 ( Kruskal或Prim)
  • 原文地址:https://www.cnblogs.com/hhh5460/p/5147103.html
Copyright © 2011-2022 走看看