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