Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 变量、命名空间和类_Python - Fatal编程技术网

Python 变量、命名空间和类

Python 变量、命名空间和类,python,Python,基于下面的示例,为什么我可以从类中打印var xyz,因为我一直认为该类存储在它自己的名称空间中 xyz = 123 >>> class test: ... def __init__(self): ... pass ... def example(self): ... print xyz ... >>> test().example() 123 谢谢类没有存储在它们自己的名称空间中。它们存储在定义它们的名称空间中;在您

基于下面的示例,为什么我可以从类中打印var xyz,因为我一直认为该类存储在它自己的名称空间中

xyz = 123
>>> class test:
...    def __init__(self):
...        pass
...    def example(self):
...        print xyz
...
>>> test().example()
123

谢谢

类没有存储在它们自己的名称空间中。它们存储在定义它们的名称空间中;在您的例子中,这是解释器会话的全局名称空间

类中的方法仍然可以引用同一命名空间中的名称

也许您在定义类时对范围感到困惑。类主体的执行就像它是一个函数一样;然后,该函数的本地名称空间形成结果类的属性。您仍然可以从外部作用域访问名称,但是:

foo = 'bar'

class Spam(object):
    baz = foo   # works, foo can be referenced

    def ham(self):
        xyz = foo  # works, foo is a global and can be referenced
        xyz = baz  # does **not** work, baz is part of the class now.
        xyz = self.baz or Spam.baz   # these do work

类不存储在它们自己的命名空间中。它们存储在定义它们的名称空间中;在您的例子中,这是解释器会话的全局名称空间

类中的方法仍然可以引用同一命名空间中的名称

也许您在定义类时对范围感到困惑。类主体的执行就像它是一个函数一样;然后,该函数的本地名称空间形成结果类的属性。您仍然可以从外部作用域访问名称,但是:

foo = 'bar'

class Spam(object):
    baz = foo   # works, foo can be referenced

    def ham(self):
        xyz = foo  # works, foo is a global and can be referenced
        xyz = baz  # does **not** work, baz is part of the class now.
        xyz = self.baz or Spam.baz   # these do work

类不存储在它们自己的名称空间中,而是定义它们自己的名称空间,即类内部定义的变量是它的本地变量,不能直接在类外部访问。但是,如果需要,类可以从全局范围访问变量

Python使用LEGB规则查找变量的值:

L:局部范围

E:封闭范围

G:球镜

内置的

立法会的例子:

输出:

因此,在您的情况下,由于在本地范围和封闭范围中都找不到xyz,因此使用全局范围来获取值

与作用域相关:
类不存储在它们自己的名称空间中,而是定义它们自己的名称空间,即类内部定义的变量是它的本地变量,不能直接在类外部访问。但是,如果需要,类可以从全局范围访问变量

Python使用LEGB规则查找变量的值:

L:局部范围

E:封闭范围

G:球镜

内置的

立法会的例子:

输出:

因此,在您的情况下,由于在本地范围和封闭范围中都找不到xyz,因此使用全局范围来获取值

与作用域相关:
该类位于名称空间中,但这并不重要。您的问题更多的是关于变量/成员的可访问性。类的成员被封装,这意味着访问是通过类进行的

xyz位于全局命名空间中。这意味着变量在整个过程中都是可访问的,而无需通过类。这是一件必须避免的事情。类在定义和实例化时都很容易创建


名称空间更容易理解,因为它只是预先挂起到该名称空间中包含的类的名称。考虑到这种方式,更多的是以类为中心,这是OOP的主要目标。

类位于名称空间中,但这不是重点。您的问题更多的是关于变量/成员的可访问性。类的成员被封装,这意味着访问是通过类进行的

xyz位于全局命名空间中。这意味着变量在整个过程中都是可访问的,而无需通过类。这是一件必须避免的事情。类在定义和实例化时都很容易创建


名称空间更容易理解,因为它只是预先挂起到该名称空间中包含的类的名称。考虑到这种方式,更多的是以类为中心,这是OOP的主要目标。

很好的解释。细节有点复杂,因为Python决定是在编译时访问本地、闭包单元还是全局函数,而不是在运行时,但是OP不必担心这些,除非他正在做一些不寻常的事情,比如在编译器背后执行新代码或修改本地函数。很好的解释。细节有点复杂,因为Python决定是在编译时访问本地、闭包单元还是全局函数,而不是在运行时,但OP不必担心这些,除非他正在做一些不寻常的事情,比如在编译器背后执行新代码或修改本地函数。
1
2
3
<built-in function sum>