0

在这堂课中:

class MyClass () :
    foo = 1

    @staticmethod
    def bar () :
        print MyClass.foo

为什么我需要获得foo资格MyClass?(否则我得到NameError: global name 'foo' is not defined.

不是foo本地的类MyClass吗?

4

5 回答 5

3

This is because Python's scope lookup order is LEGB (locals, enclosed function, global, builtin). More details in this answer. Python has an explicit class variable, which is the first argument of the method, typically named self. Normally one would access foo by using self.foo But in this case, the function is a static method, so it does not receive an explicit class variable, so there is no alternative way to access foo. Either remove the reference to foo or remove the @staticmethod decorator from the bar()and add self as the first argument of bar().

于 2013-11-06T16:02:50.417 回答
0

This is called class attribute which could be accessed directly by MyClass.foo, and owned by the class. It's not owned by the instances of the class

for self this is instance variable, each instance of a class has a new copy of the variables

于 2013-11-06T16:02:20.830 回答
0

foo 不是 MyClass 类的本地对象吗?

实际上,没有。class它位于语句体的本地,bar函数无法访问。一旦类对象创建并绑定到MyClassfoo就成为类对象的一个​​属性(就像barFWIW 一样),但那是命名空间,而不是作用域。

另外和 FWIW,Pythonstaticmethod不访问类本身。如果您想要一个需要访问该类的方法,请改用 a classmethod

于 2013-11-06T16:08:53.633 回答
0

在 Python 中,“局部变量”的概念真正完全存在于函数中。类中的函数(方法)没有对类(或实例)范围的隐式访问;您必须明确指定包含所需属性的对象,即类或实例(按照约定传递给方法self)。至于为什么要这样设计……你得问 Guido,但 Python 的禅宗说“显式胜于隐式”,所以这可能与它有关。

于 2013-11-06T16:08:25.927 回答
0

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

您可以阅读更多关于它的信息 -在文档中

于 2013-11-06T16:01:14.727 回答