Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.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_Class_Namespaces_Scope - Fatal编程技术网

Python类中的名称空间

Python类中的名称空间,python,class,namespaces,scope,Python,Class,Namespaces,Scope,我有这个: class MyClass: """A simple example class""" i = 12345 def f(self): print i # self.i will work just fine return 'hello world' 当我这样做时: >>> x = MyClass() >>> >>> x.f() 我

我有这个:

class MyClass:
    """A simple example class"""
    i = 12345
    def f(self):
        print i                     # self.i will work just fine
        return 'hello world'
当我这样做时:

>>> x = MyClass()
>>> 
>>> x.f()
我得到了一个错误,正如预期的那样

我的问题是:

  • 为什么我会出错

  • 为什么函数(或方法)定义的名称空间和包含类的模块的全局名称空间之间没有名称空间

  • 在这种情况下,除了使用self之外,还有其他方法在f中引用i吗

  • 出现错误,因为
    print i
    正在尝试打印全局(用于模块)变量
    i
    。如果要使用该类的成员,应编写
    self.i
  • 因为Guido Van Rossum决定不使用名称空间。事实上,我不知道该怎么回答了
  • 是的,但不是。是的,因为您可以使用“反射”(我不记得它在python中是如何调用的)并访问该类的任何成员。不,因为使用
    self
    是唯一可用的方法
  • 为什么我会出错

    答:这是因为变量i&指向函数/方法代码的符号/级别f位于MyClass命名空间中,而函数f的值/可调用代码/主体位于全局命名空间中

    为什么函数的名称空间(或)之间没有名称空间 方法)定义和包含 班级

    答:不确定为什么python设计器决定将函数名/符号放在类中,而将其主体放在全局命名空间中

    在这种情况下,除了 使用self


    回答:我不这么认为,但即使是这样,逻辑/代码

    您使用的是什么版本的python可能也不容易?@SnakesandCoffee:这与问题无关。对于3,可能重复:是的,通过类引用它:
    MyClass.I
    。同样相关:对于2,将类作为名称空间没有意义。如果您更改了可变
    i
    的内容,这意味着什么?对于类对象,即子类的实例,是否已更改?显式优于隐式,因此对于类,您必须显式地说明要引用的内容。类属性、继承的类属性或实例属性本身。@MartijnPieters感谢您的精彩解释。