为什么我需要限定局部变量?

时间:2013-11-06 16:00:01

标签: python

在这堂课中:

class MyClass () :
    foo = 1

    @staticmethod
    def bar () :
        print MyClass.foo

为什么我需要使用foo来限定MyClass? (否则我得到NameError: global name 'foo' is not defined

班级foo不是MyClass本地的吗?

5 个答案:

答案 0 :(得分:3)

这是因为Python的范围查找顺序是LEGB(本地,封闭函数,全局,内置)。 this answer中的更多详细信息。 Python有一个显式的类变量,它是该方法的第一个参数,通常名为self。通常使用foo访问self.foo但是在这种情况下,函数是静态方法,因此它不接收显式类变量,因此没有其他方法可以访问{{1} }。删除对foo的引用或从foo中移除@staticmethod装饰器,并添加bar()作为self的第一个参数。

答案 1 :(得分:0)

你需要这样做,因为bar函数是一个静态方法。这意味着您可以在不考虑包含类的实例的情况下调用它。 IE您不必创建类的实例来访问该函数。

您可以阅读更多相关信息 - in the documentation

答案 2 :(得分:0)

这称为类属性 可以由MyClass.foo直接访问,并由班级拥有。 它不属于类

的实例

对于self这是实例变量,类的每个实例都有一个新的变量副本

答案 3 :(得分:0)

在Python中,“局部变量”的概念实际上只存在于函数中。类中的函数(方法)没有对类(或实例)范围的隐式访问;您必须显式指定包含所需属性的对象,即类或实例(按惯例传递给方法self)。至于为什么它是这样设计的......你必须要问Guido,但是Python的Zen说“显式优于隐式”,因此可能与它有关。

答案 4 :(得分:0)

  

MyClass类不是foo本地的吗?

实际上,没有。它是class语句正文的本地,bar函数无法访问。一旦创建并绑定到MyClass的类对象,foo就成为类对象的属性(就像bar FWIW),但那是命名空间,而不是范围。

同样和FWIW,Python的staticmethod不要访问类本身。如果您需要一个需要访问该类的方法,请改用classmethod

相关问题