zoukankan      html  css  js  c++  java
  • 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

    json于pickle的区别:

    1、json是所有语言通用

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

    3、pickle只能在python内使用

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

  • 相关阅读:
    基于requirejs和oclazyloadjs的实际按需加载的angular项目
    vue源码解析data与watcher
    video标签播放数据调整
    ngnix搭建前端服务
    面试总结篇(一)
    mongodb的安装、配置、启动、数据库密码的配置;
    今天随手写个发布订阅的 event.js
    Mac OS系统使用的链接,以及关于前端软件的安装(持续更新)
    bind 以及原型 1px边框的实现(面试后内容整理)
    flexbox的学习,display:flex display:box 淘宝触屏版、饿了么网布局分析分析
  • 原文地址:https://www.cnblogs.com/chen1930/p/6032619.html
Copyright © 2011-2022 走看看