Python_闭包和装饰器

Python 命名空间

 Namespaces and Scope: multiple namespaces
     对象和名称的归属--Search   closure  enclosing
	   Local_Global_built-in

内置名字空间,任何模块均可访问它,它存放着内置的函数和异常。
全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。 global声明 是对整个环境下的变量起作用
闭包: 闭包通常与函数相关联
局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量	
	   
1. the local space
   locals()是Python中一个非常有用的内置函数,尤其是在调试和检查当前作用域的局部变量   
    locals()函数不需要任何参数,并且返回当前局部变量作用域的内容 
	
2 Enclosed(闭包作用域):闭包中外部函数定义的变量,但非全局变量
   Enclosed  由闭包函数和其外部函数共同创建的一个作用域
    闭包(Closure)
      闭包是由一个函数以及创建该函数时的作用域中变量的引用环境共同组成的	
	  
    创建闭包--使用闭包		
    内层函数不仅可以访问,还要可以修改外层函数的变量,那么需要用到 nonlocal声明
           nonlocal 关键字是定义在闭包里面的	

    d.__closure__
    闭包的__closure__方法,可以查看每个cell对象的内容。
    
    for i in d.__closure__:
        print(i.cell_contents)
    cell_contents 解释了局部变量在脱离函数后仍然可以在函数之外被访问的原因,
	因为变量被存储在cell_contents中了			   

3. globals()  以及  dir()   #  获得当前模块的属性列表
  
   Modules are Python files, and they contain objects such as functions that can be imported and used by other programs
   __dict__ This dictionary is the namespace for the module.
    __name__  
	     当 Python 文件作为一个独立脚本运行时,__name__ 被设置为 "__main__",而在被其他模块导入时,__name__ 被设置为该模块的名称	
	__file__ 
	    是一个保存着当前模块所在文件名的全路径的字符串变量,用于获取当前脚本的绝对路径	
    dir()带参数时,返回参数的属性、方法列表	 
     			
4.built-ins 	默认导入  has a dict attribute 
	   two default modules without requiring an import: the module main and the module builtins .
	builtins.py  模块,是python的内建模块,在运行时会自动导入该模块。在该模块中定义了很多我们常用的内置函数,比如printinput 等。
    
    builtins是一个内置模块,它在Python解释器启动时自动加载,并包含了一组Python的内置函数、异常和常量
      Python 的内置模块通常被编译到 Python 解释器-builtins.py看起来只包含了空函数定义	
       实际上是通过Python的C API接口调用C语言实现的底层函数	
    解释器实现的,它们的具体实现通常是用C语言编写 __builtins__.__dict__ 约有151个函数和变量
	   moduleSpec
	   class 
	   built-in function
	 
       Ellipsis 对象: 在python代码中通常写作 … ,	
        Exception  TypeError 		   

闭包的应用场景

闭包的应用场景
1.数据封装和隐私:
	闭包可以用来封装数据,通过内部函数来访问这些数据,而外部代码无法直接访问这增加了数据的安全性
	把一些变量隐藏到函数内部,作为局部变量但是由于Python中作用域的搜索顺序,函数内的变量不会被函数外的代码读取到
        想要函数外部的代码能够读取函数内部的变量,那么就可以使用闭包,函数内部再定义一个函数,这样就可以引用到外层变量
     局部变量无法共享和长久的保存,而全局变量可能造成变量污染,闭包既可以长久的保存变量又不会造成全局污染
	面向对象: 这方面--“读取函数内部的变量”和“让函数内部的局部变量始终保持在内存中”,都可以被 Python 中现成的对象“类”很好地实现
2.函数工厂:
	闭包可以用来创建具有特定行为或状态的函数对象这些函数对象可以根据需要定制

3.装饰器:
	Python中的装饰器本质上就是闭包的一种应用装饰器接收一个函数作为参数,并返回一个新的函数,这个新函数在某种条件下会调用原函数
    通过闭包,装饰器可以记住额外的状态信息,并在被装饰的函数执行时使用这些信息
	 内置装饰器: @classmethod  @staticmethod  @property
	 自定义装饰器(无参)  @functools.wraps(func)
	绝大多数装饰器都是基于函数和 闭包 实现的
	 面向对象设计(Object-Oriented Design,OOD):Python 对某个对象是否能通过装饰器( @decorator)形式使用只有一个要求:
	    decorator 必须是一个“可被调用(callable)的对象
	   函数自然是“可被调用”的对象但除了函数外,我们也可以让任何一个类(class)变得“可被调用”(callable)。
	      只要自定义类的 __call__ 魔法方法即可	
4.延迟计算:
	闭包可以用来实现惰性求值(Lazy Evaluation),即只有在需要的时候才进行计算

函数

 列表推导式  迭代式  生成器 装饰器 
  zip()
    zip函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器	 
	
装饰器的背后--是语言开发模式的设计,应用者先使用,再去探索这之后的原因,而使用前的有限信任和有限开始,是行动的一种重要方式

python

 Python中,注解(Annotations)是一种为变量、函数参数、函数返回值等添加元信息的方式	
     -> 类型提示(Type Hints)
	 装饰器注解
	  **三、上下文管理器注解**
	  简化类定义 避免手动编写大量的样板代码  自动生成方法 提高开发效率
 Java 注解(Anno
    注解并不直接影响代码的语义,但却能被某些工具软件(如编译器、框架)所读取和利用	
      编译检查 - 如@Override放在方法前,如果该方法不是重写父类的方法,则编译器会发出警告
      生成额外的文件 - 如Javadoc工具会根据源码中的注解来生成API文档	
       编译时动态处理-在编译时读取注解的信息,然后根据注解的信息进行一些其他处理
   注解的声明 和使用   用于注解其他注解的注解称为元注解
      内置注解 @Override  @Deprecated	   

参考

 【python】Python中闭包的是什么,闭包原理分析与应用实战 https://blog.csdn.net/littlefun591/article/details/140492786
  The Practice of Computing Using Python, 2nd International Edition  
posted @   辰令  阅读(14)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示