Python命名空间、作用域和装饰器怎么使用


今天小编给大家分享一下Python命名空间、作用域和装饰器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。命名空间是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。内置名称空间(built-in names):存放内置的名字,如len/eval/enumerate/bytes/max/min/sorted/map/filter....全局名称空间(global names):模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。局部名称空间(local names):函数内部的名字都是局部名称空间,不同函数内部的名字互不干涉。如果找不到变量 runoob,它将放弃查找并引发一个 NameError 异常:查找顺序:假设我们要使用变量 runoob,则 Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。执行顺序:先内置(Python解释器启动的时候才会生成)-> 全局(文件执行的时候才会生成)-> 局部(函数调用的时候才会生成)命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。因此,我们无法从外部命名空间访问内部命名空间的对象。如下图所示,相同的对象名称可以存在于多个命名空间中。作用域就是一个 Python 程序可以直接访问命名空间的正文区域。全局名称空间和局部名称空间中可能会存在名字相同的变量,但是这两个变量互不影响。Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:L(Local):最内层,包含局部变量,比如一个函数/方法内部。E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。G(Global):当前脚本的最外层,比如当前模块的全局变量。B(Built-in): 包含了内建的变量/关键字等。,最后被搜索对于变量作用域,变量的访问以:L –> E –> G –>B 的 规则查找。在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。举例:内置作用域是通过一个名为 builtin 的标准模块来实现的,但是这个变量名自身并没有放入内置作用域内,所以必须导入这个文件才能够使用它。在Python3.0中,可以使用以下的代码来查看到底预定义了哪些变量:Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while免费云主机域名等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:实例中 msg 变量定义在 if 语句块中,但外部还是可以访问的。如果将 msg 定义在函数中,则它就是局部变量,外部不能访问。定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。函数内可以访问全局变量,但不能直接更新(修改)其值,可以加上 global 引用以更新变量值 :如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。延迟计算(原来我们是传参,现在我们是包起来)、爬虫领域。装饰器指的是为被装饰器对象添加额外功能。因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能。装饰器的实现必须遵循两大原则:不修改被装饰对象的源代码不修改被装饰对象的调用方式装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能。不改变函数体代码,并且不改变函数调用方式,它本质就是一个闭包函数。在不改变当前函数的情况下, 给其增加新的功能:回调函数和返回函数的实例就是装饰器。举例:如果原始的被装饰函数index()有返回值的时候,wrapper()函数的返回值应该和index()的返回值相同,也就是说,我们需要同步原始的index()和wrapper()方法的返回值。如果原始的被装饰函数index()方法需要传参,那么我们之前的装饰器是无法实现该功能的,由于有wrapper()=index(),所以给wrapper()方法传参即可。在被装饰函数正上方,并且是单独一行写上@装饰器名注意无参装饰器只套两层。我们首先看看三层闭包怎么运用。在函数中嵌入装饰器username: nick
password: 123
base of file
login successful
welcome to index没错,装饰器不仅可以是函数,还可以是类,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器主要依靠类的__call__方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。使用装饰器极大地复用了代码,但是他有一个缺点就是原函数的元信息不见了,比如函数的docstring、__name__、参数列表,先看例子:不难发现,函数 f 被with_logging取代了,当然它的docstring,__name__就是变成了with_logging函数的信息了。好在我们有functools.wraps,wraps本身也是一个装饰器,它能把原函数的元信息拷贝到装饰器里面的 func 函数中,这使得装饰器里面的 func 函数也有和原函数 foo 一样的元信息了。一个函数还可以同时定义多个装饰器,比如:它的执行顺序是从里到外,最先调用最里层的装饰器,最后调用最外层的装饰器,它等效于现在我们来看一下装饰器在哪些地方特别耀眼,以及使用它可以让一些事情管理起来变得更简单。装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint)。它们被大量使用于Flask和Django web框架中。这里是一个例子来使用基于装饰器的授权:日志是装饰器运用的另一个亮点。这是个例子:以上就是“Python命名空间、作用域和装饰器怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。

相关推荐: vue中v-if和v-for优先级是什么

本文小编为大家详细介绍“vue中v-if和v-for优先级是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中v-if和v-for优先级是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 在vue2中,v-for的优先级…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/07 19:33
下一篇 05/07 19:34

相关推荐