在这堂课中:
class MyClass () :
foo = 1
@staticmethod
def bar () :
print MyClass.foo
为什么我需要使用foo
来限定MyClass
? (否则我得到NameError: global name 'foo' is not defined
。
班级foo
不是MyClass
本地的吗?
答案 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
。