首页 > 编程语言 > 详细

Python入门5

时间:2016-11-12 09:29:32      阅读:288      评论:0      收藏:0      [点我收藏+]

装饰器

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

原文:http://www.cnblogs.com/chen1930/p/6032619.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!