Python名称空间是关于什么的

Python名称空间是关于什么的,python,programming-languages,namespaces,Python,Programming Languages,Namespaces,我刚刚开始学习Python&在Python中遇到了“名称空间”的概念。虽然我知道它是什么,但我无法理解这个概念的严重性 网络上的一些浏览显示,反对PHP的原因之一是它对名称空间没有本机支持 有人能解释一下如何使用名称空间吗?这个特性如何让编程变得更好(不仅仅是在Python中,因为我假设名称空间的概念并不局限于特定的语言) 我主要来自Java和C编程背景。要理解名称空间,还必须了解Python中的模块。模块只是一个包含Python代码的文件。这些代码可以是Python类、函数的形式,也可以只是一

我刚刚开始学习Python&在Python中遇到了“名称空间”的概念。虽然我知道它是什么,但我无法理解这个概念的严重性

网络上的一些浏览显示,反对PHP的原因之一是它对名称空间没有本机支持

有人能解释一下如何使用名称空间吗?这个特性如何让编程变得更好(不仅仅是在Python中,因为我假设名称空间的概念并不局限于特定的语言)


我主要来自Java和C编程背景。

要理解名称空间,还必须了解Python中的模块。模块只是一个包含Python代码的文件。这些代码可以是Python类、函数的形式,也可以只是一个名称列表。每个模块都有自己的全局名称空间。因此,同一模块中不能有两个类或两个函数使用相同的名称,因为它们共享模块的命名空间


引用:

名称空间防止可能由不同人员编写的具有相同名称的类、方法和对象之间发生冲突

来自Java背景的您可能熟悉如何使用软件包实现这一点,例如,您可以创建
movieoda.DateUtils
类,我可以创建
mikej.DateUtils
类,该软件包允许代码使用类来区分它们。(Python已经做到了。)


PHP在5.3.0中添加了名称空间,但在早期版本中(以及在其他不提供名称空间的语言中),您必须在类和方法名称前面加上前缀,以减少名称冲突的风险。e、 g.a
movieyoda_parse_文件
函数。

如果您与其他人一起制作一个大型程序,您可以根据需要编写自己的程序部分。文件中的所有变量都是私有的,不会发生冲突。 编写PHP程序时,很容易错误地重写全局变量。在python中,如果需要,您可以导入其他模块变量,它们在您的模块上是“全局”的


在Python中,您可以认为一个文件一个对象。在编写PHP程序时,可以通过编写带有实例变量的类来实现同样的效果。

命名空间是实现作用域的一种方法

在Java(或C)中,编译器通过静态作用域分析确定变量在何处可见

  • 在C语言中,作用域要么是函数体,要么是全局的,要么是外部的。编译器会为您解释这一点,并根据作用域规则解析每个变量名。编译所有模块后,链接器将解析外部名称

  • 在Java中,作用域是一个方法函数的主体,或者是一个类的所有方法。有些类名也具有模块级作用域。同样,编译器在编译时计算出这一点,并根据作用域规则解析每个名称

在Python中,每个包、模块、类、函数和方法函数都拥有一个“名称空间”,在其中解析变量名。另外,如果名称不在本地名称空间中,则会使用全局名称空间

每个变量名在本地名称空间(函数体、模块等)中检查,然后在全局名称空间中检查

变量通常只在本地名称空间中创建。
global
nonlocal
语句可以在本地名称空间以外的地方创建变量


当对函数、方法函数、模块或包求值(即开始执行)时,将创建一个命名空间。将其视为“评估上下文”。当函数或方法函数等完成执行时,命名空间将被删除。变量被删除。这些物体也可能会掉落。

我完成了S.Lott的回答


我想说,命名空间是在作用域内实现名称管理的一种方式,因为作用域所做的不仅仅是名称管理

在C语言中,作用域有4种类型:全局、函数、块和函数参数(原型)。根据需要,每种类型都可以创建一个或多个名称空间。C中有4个N --s/u/e的标签 --类型名、函数名和变量名的ID --函数原型中的参数 --s/u中的成员和位字段

与此类似,标记标识符和函数名不会发生冲突,但typedef定义的TypeName会与变量名发生冲突

在python中,有一个内置名称空间,它包含全局ns,全局ns由加载的模块提供。内置项包含变量。变量的符号可以定义对象或函数——例如,
+
在其中定义。模块的全局ns持续到终端


当然也请参见。

名称空间提供了一种管理范围内定义的标识符的方法。换句话说,它们用于将名称映射到值(或者更精确地说,映射到内存位置的引用)

例如,在名称空间的上下文中,以下表达式

x = 10
将标识符
x
与保存值为
10
的对象的内存位置相关联


在Python中,基本上有两种“类型”的名称空间实例和类名称空间

实例名称空间管理单个对象范围内名称和值之间的映射。另一方面,源代码中定义的每个类都有一个单独的类命名空间。这种类型的命名空间处理对象的所有实例共享的所有成员


示例

现在考虑下面的例子,每个成员都表示它属于一个类或实例命名空间:

class Customer:

    def __init__(self, first_name, last_name, email): # __init__ -> Customer Class Namespace
        self._first_name = first_name # _first_name -> Instance Namespace
        self._last_name = last_name # _last_name -> Instance Namespace
        self._email = email # _email -> Instance Namespace

    def get_full_name(self): # Customer Class Namespace
        return f"{self._first_name} {self._last_name}"


class PremiumCustomer(Customer):

    PREMIUM_MEMBERSHIP_COST = 4.99  # PremiumCustomer Class Namespace


    class Subscription: # PremiumCustomer Class Namespace

        def __init__(self, customer_email): # Subscription Class Namespace
            self._customer_email = customer_email # Instance Namespace

    def __init__(self, first_name, last_name, email, card_number): # PremiumCustomer Class Namespace
        super().__init__(first_name, last_name, email)
        self._card_number = card_number # _card_number -> Instance Namespace

    def get_card_number(self): # PremiumCustomer Class Namespace
        return self._card_number

几个小时前,另一个PHP家伙在名称空间方面遇到了问题:可能值得一读