zoukankan      html  css  js  c++  java
  • 闭包和装饰器

    gloab和nonlocal

    glob:在局部作用域中使用全局变量
    nonlocal:主要用于函数嵌套时,使用外层函数的变量

    闭包

    函数内部定义的函数称为内部函数,该内部函数包含对外部(上层)作用域,而不是对全局作用域名字的,那么该内部函数称为闭包函数

    闭包函数的基本形式

    def func1():
        name='hello world'
        def func2():
            print(name)
        return func2
    

    装饰器

    程序源代码的原则:对功能扩展开放,对修改源代码封闭
    即可以在源代码的基础上扩展功能,而不能修改源代码(原因是,系统上线了修改源代码,改错了咋整)
    装饰器就是用来进行源代码功能能扩展的一种实现方式。
    装饰器本质上是任意可调用的对象,目前能够理解的就是是函数,而被装饰的对象也可以是任意可调用的对象。
    装饰器功能:是在不修改被装饰对象源代码以及被装饰对象的调用方式的前提下,为其添加新功能
    装饰器原则:不修改源代码,不修改调用方式,还要能够增加新功能

    装饰器基本形式

    #装饰器定义
    def deco(func):
        def wrapper(*args,kwargs):
            pass
            res=func()
            return res
        return wrapper
        
    #使用装饰器
    @deco
    def func1():
        pass
    

    保留原函数帮助文档

    使用wraps

    from functools import wraps
    def deco(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
            pass
            res=func()
            return res
        return wrapper
    

    有参装饰器

    #装饰器定义
    def deco2(pattern):
        def deco(func):
            def wrapper(*args,kwargs):
                pass
                res=func()
                return res
            return wrapper
        return deco
        
    #使用装饰器
    @deco(pattern)
    def func1():
        pass
    
  • 相关阅读:
    SettingsProvider 它SettingsCache
    14、Cocos2dx 3.0三,找一个小游戏开发Scene and Layer:游戏梦想
    open-flash-chart2各种效果
    Android使用surface直接显示yuv数据(三)
    LeetCode:Populating Next Right Pointers in Each Node
    zoj 3203 Light Bulb,三分之二的基本问题
    POJ 2485 Highways
    Leetcode
    android音乐柱状频谱实现
    Android自定义控件实战——水流波动效果的实现WaveView
  • 原文地址:https://www.cnblogs.com/chenrenjian/p/7050290.html
Copyright © 2011-2022 走看看