代码之家  ›  专栏  ›  技术社区  ›  Srikar Appalaraju Tonetel

Python名称空间是关于什么的

  •  39
  • Srikar Appalaraju Tonetel  · 技术社区  · 15 年前

    “命名空间”

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

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

    5 回复  |  直到 11 年前
        1
  •  46
  •   S.Lott    15 年前

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

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

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

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

    每个变量名都签入本地命名空间(函数体、模块等),然后签入全局命名空间。

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

        2
  •  5
  •   mikej heading_to_tahiti    15 年前

    来自Java背景,您可能熟悉如何使用包来实现这一点,例如,您可以创建 movieyoda.DateUtils 类和我可以创建 mikej.DateUtils something very similar .)

    movieyoda_parse_file 功能。

        3
  •  4
  •   shahjapan    15 年前

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

    参考: http://bytebaker.com/2008/07/30/python-namespaces/

        4
  •  0
  •   alinsoar    9 年前

    我可以说,名称空间是在作用域内实现名称管理的一种方法,因为作用域所做的不仅仅是名称管理。

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

    与此类似,标记标识符和函数名不会冲突,但由typedef定义的类型名可以与变量名冲突。

    + 是在那里定义的。模块的全局ns一直持续到终止。

    另见 that 当然还有 that .

        5
  •  0
  •   Giorgos Myrianthous    6 年前

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

    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
    
        6
  •  -1
  •   Adam Wallner    15 年前

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

    你可以用Python把一个文件看作一个对象。编写PHP程序时,可以通过编写带有实例变量的类来实现相同的目的。

    推荐文章