1930251516

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

装饰器

装饰器英文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

json于pickle的区别:

1、json是所有语言通用

2、json只能操作基本数据类型,比如字典、列表、元祖等

3、pickle只能在python内使用

4、pickle可以序列化python内的所有类型

 

posted on 2016-11-12 08:52  1930251516  阅读(118)  评论(0编辑  收藏  举报