Decorator

作者: satyrs_sh | 来源:发表于2017-12-04 02:29 被阅读0次

    functional programming concepts

    分两类:

    • Function decorators
    • Class decorators

    A decorator in Python is any callable Python object that is used to modify a function or a class. A reference to a function "func" or a class "C" is passed to a decorator and the decorator returns a modified function or class. The modified functions or classes usually contain calls to the original function "func" or class "C".

    show me the code

    • 参数检查
    def argument_test_natural_number(f):
        def helper(x):
            if type(x) == int and x > 0:
                return f(x)
            else:
                raise Exception("Argument is not an integer")
        return helper
        
    @argument_test_natural_number
    def factorial(n):
        if n == 1:
            return 1
        else:
            return n * factorial(n-1)
    
    for i in range(1,10):
        print(i, factorial(i))
    
    print(factorial(-1))
    
    • 统计次数
    def call_counter(func):
        def helper(*args, **kwargs):
            helper.calls += 1
            return func(*args, **kwargs)
        helper.calls = 0
    
        return helper
    
    @call_counter
    def succ(x):
        return x + 1
    
    @call_counter
    def mul1(x, y=1):
        return x*y + 1
    
    print(succ.calls)
    for i in range(10):
        succ(i)
    mul1(3, 4)
    mul1(4)
    mul1(y=3, x=2)
        
    print(succ.calls)
    print(mul1.calls)
    
    • 含参数的decorator
    def greeting(expr):
        def greeting_decorator(func):
            def function_wrapper(x):
                print(expr + ", " + func.__name__ + " returns:")
                func(x)
            return function_wrapper
        return greeting_decorator
    
    @greeting("-wyq-")
    def foo(x):
        print(42)
    
    foo("Hi")
    
    • using import 要注意变量的域

    greeting_decorator.py 没用functools的版本

    def greeting(func):
        def function_wrapper(x):
            """ function_wrapper of greeting """
            print("Hi, " + func.__name__ + " returns:")
            return func(x)
        function_wrapper.__name__ = func.__name__
        function_wrapper.__doc__ = func.__doc__
        function_wrapper.__module__ = func.__module__
        return function_wrapper
    

    anotherfile.py:

    from greeting_decorator import greeting
    
    @greeting
    def f(x):
        """ just some silly function """
        return x + 4
    
    f(10)
    print("function name: " + f.__name__)
    print("docstring: " + f.__doc__)
    print("module name: " + f.__module__)
    

    greeting_decorator.py

    from functools import wraps
    
    def greeting(func):
        @wraps(func)
        def function_wrapper(x):
            """ function_wrapper of greeting """
            print("Hi, " + func.__name__ + " returns:")
            return func(x)
        return function_wrapper
    

    否则将返回

    function name: function_wrapper
    docstring:  function_wrapper of greeting 
    module name: greeting_decorator
    
    • __call__
    class Fibonacci:
        def __init__(self):
            self.cache = {}
        def __call__(self, n):
            if n not in self.cache:
                if n == 0:
                    self.cache[0] = 0
                elif n == 1:
                    self.cache[1] = 1
                else:
                    self.cache[n] = self.__call__(n-1) + self.__call__(n-2)
            return self.cache[n]
    
    fib = Fibonacci()
    
    for i in range(15):
        print(fib(i), end=", ")
    
    • using class
    class decorator2:
        
        def __init__(self, f):
            self.f = f
            
        def __call__(self):
            print("Decorating", self.f.__name__)
            self.f()
    
    @decorator2
    def foo():
        print("inside foo()")
    
    foo()
    

    相关文章

      网友评论

          本文标题:Decorator

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