Python命名空间是啥
我刚开始学习Python,遇到了“命名空间”这个概念。虽然我大概明白它是什么,但还没能完全理解这个概念的重要性。
我在网上查了一下,发现反对PHP的一个原因是它没有原生的命名空间支持。
能不能有人解释一下如何使用命名空间,以及这个功能是如何让编程变得更好的(不仅仅是在Python中,因为我觉得命名空间这个概念并不是某一种语言特有的)。
我主要是来自Java和C语言的背景。
6 个回答
要理解命名空间,你需要先了解一下Python中的模块。模块就是一个包含Python代码的文件。这些代码可以是Python类、函数,或者只是一些名字的列表。每个模块都有自己的全局命名空间。所以在同一个模块里,你不能有两个同名的类或函数,因为它们共享这个模块的命名空间。
命名空间的作用是防止不同人写的类、方法和对象之间因为名字相同而产生冲突。
如果你有Java的背景,可能会知道这是怎么通过包来实现的。比如,你可以创建一个 movieyoda.DateUtils
类,而我可以创建一个 mikej.DateUtils
类。这样,使用这些类的代码就能区分它们。(Python也有类似的东西,具体可以参考这个链接。)
命名空间是在PHP 5.3.0版本中加入的,但在更早的版本中(以及其他不支持命名空间的语言中),你需要在类和方法的名字前加上前缀,以减少名字冲突的风险。例如,可以用 movieyoda_parse_file
这个函数名。
命名空间是一种实现作用域的方式。
在Java(或C语言)中,编译器通过静态作用域分析来判断一个变量在哪里可以被看到。
在C语言中,作用域可以是一个函数的主体、全局作用域或者外部作用域。编译器会根据作用域规则为你推理出这些,确定每个变量的名称。外部名称在所有模块编译完后由链接器来解决。
在Java中,作用域是一个方法的主体,或者一个类的所有方法。有些类名也有模块级的作用域。同样,编译器在编译时会搞清楚这些,并根据作用域规则来解决每个名称。
在Python中,每个包、模块、类、函数和方法都有一个“命名空间”,在这个命名空间中变量名称会被解析。此外,还有一个全局命名空间,如果名称不在本地命名空间中,就会使用这个全局命名空间。
每个变量名称会先在本地命名空间(比如函数主体、模块等)中查找,然后再在全局命名空间中查找。
变量通常只在本地命名空间中创建。global
和nonlocal
语句可以在本地命名空间之外创建变量。
当一个函数、方法、模块或包被执行(也就是开始运行)时,会创建一个命名空间。可以把它想象成一个“执行上下文”。当函数或方法等执行完毕后,这个命名空间就会消失,里面的变量也会被清除,可能还有一些对象也会被清除。