Python入门5

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅

Python入门5

Python编程入门与实践pdf电子版下载

Python爬虫入门教程 5-100 27270图片爬取

5分钟快速入门,用Python做SQLite数据库开发,附代码适合初学

给有C或C++基础的Python入门 :Python Crash Course 5 if语句