首页 > 代码库 > Python入门5

Python入门5

装饰器

装饰器英文Decorator,自身是一个函数,用来包装其它的函数,实现在不改变原来代码的情况下,增加新的功能,返回一个修改后的函数对象,

装饰器功能:

1、装饰器也是函数

2、在不改变原有代码的情况下,增加新的功能 

3、符合开放-封闭原则

在学习装饰器之前,我们复习一下函数的相关概念

理解函数也是变量

技术分享

当我们执行函数不加括号的时候,输出函数的内存地址:

def foo():
    print(hello)

print(foo)

# 输出
<function foo at 0x0000000002CBCBF8>

当我们加上括号后,输出

def foo():
    print(hello)

foo()

# 输出
hello

高阶函数:

1、把一个函数名当做实参传给另外一个函数

def bar():
    print(bar)

def t1(func):
    func()

t1(bar)

# 输出
bar

2、返回值中包含函数名

def bar():
    print(bar)

def t1(func):
    return func

print(t1(bar))

# 输出
<function bar at 0x000000000303CBF8>

函数嵌套 

def foo():
    print(foo)

    def bar():
        print(bar)
    bar()

foo()

前面做了那么多的铺垫,都是为了后边的装饰器,装饰器的组成离不开高阶函数+函数嵌套

无参数装饰器

def logger(func):
    def inner():
        print(logger start)
        res = func()
        print(logger stop)
        return res

    return inner

@logger
def test1():
    print(test1)

def test2():
    print(test2)

test1()
test2()

# 输出
logger start
test1
logger stop
test2

带固定参数装饰器

def logger(func):
    def inner(arg):
        print(logger start)
        res = func(arg)
        print(logger stop)
        return res

    return inner


@logger
def test1():
    print(test1)


@logger
def test2(name):
    print(test2, name)


# test1()
test2(chen)

# 输出
logger start
test2 chen
logger stop

但是这个时候我的test1函数不能调用了,因为它没有参数,怎么解决,让test1没有参数,test2带参数都可以是用呢?

非固定参数装饰器

def logger(func):
    def inner(*args, **kwargs):
        print(logger start)
        res = func(*args, **kwargs)
        print(logger stop)
        return res

    return inner


@logger
def test1():
    print(test1)


@logger
def test2(name):
    print(test2, name)


test1()
test2(chen)

终极版

def logger(write_type):
    # print(write_type)
    def outer_wrapper(func):
        def inner(*args, **kwargs):
            if write_type == file:
                print(logger start)
                res = func(*args, **kwargs)
                print(logger stop)
                return res
            elif write_type == db:
                print(no support db)
        return inner

    return outer_wrapper


@logger(write_type=file)
def test1():
    print(test1)
    return return test1


@logger(write_type=db)
def test2(name):
    print(test2, name)


a = test1()
print(a)
test2(chen)

# 输出
logger start
test1
logger stop
return test1
no support db

 

 

生成器

1、生成器只有在调用时候,才会生成相应的数据

2、

 

 

json和pickle

 

Python入门5