Python Decorator

Python Decorator

普通函数装饰器

函数接收一个 函数名 作为参数 内部定义一个函数, 接收参数, 然后 内部函数内部 执行接收的函数名 最后外部函数返回内部函数

def loger(fun):
    def show(*args, **kwargs):
        print("记录日志->执行前")
        fun(*args, **kwargs)
        print("记录日志->执行后")
    return show


@loger
def xiaoming():
    print("function is running......")


@loger
def jack():
    print("function is running......")


xiaoming()
jack()
print("---" * 30)

可接收参数的普通函数装饰器

在不接受参数的装饰器基础上, 外面增加一层函数, 接收参数

def say_hello(contry):
    def loger(fun):
        def show(*args, **kwargs):
            if contry == 'china':
                print('中国')
            elif contry == 'english':
                print('English')
            print("记录日志->执行前")
            fun(*args, **kwargs)
            print("记录日志->执行后")
        return show
    return loger


@say_hello('china')
def xiaoming():
    print("function is running......")


@say_hello('english')
def jack():
    print("function is running......")


xiaoming()
jack()
print("---" * 30)

普通类装饰器

init 接收被装饰的函数名 call 接收参数

class Loger(object):

    def __init__(self, fun):
        self.fun = fun

    def __call__(self, *args, **kwargs):
        print("before fun run")
        self.fun(*args, **kwargs)
        print("after fun run")


@Loger
def xiaoming():
    print("function is running......")


@Loger
def jack():
    print("function is running......")


xiaoming()
jack()
print("---" * 30)

可接收参数的类装饰器

init 接收参数 call 接收被装饰的函数名, 内部定义一个函数接收参数, 并执行外部接收的函数名

class SLoger(object):

    def __init__(self, contry):
        self.contry = contry

    def __call__(self, fun):
        def show(*args, **kwargs):
            if self.contry == 'china':
                print("中国")
            elif self.contry == 'english':
                print("English")

            print("before fun run")
            fun(*args, **kwargs)
            print("after fun run")
        return show


@SLoger('china')
def xiaoming():
    print("function is running......")


@SLoger('english')
def jack():
    print("function is running......")


xiaoming()
jack()
print("---" * 30)