在这堂课中:
class MyClass () :
foo = 1
@staticmethod
def bar () :
print MyClass.foo
为什么我需要获得foo
资格MyClass
?(否则我得到NameError: global name 'foo' is not defined
.
不是foo
本地的类MyClass
吗?
在这堂课中:
class MyClass () :
foo = 1
@staticmethod
def bar () :
print MyClass.foo
为什么我需要获得foo
资格MyClass
?(否则我得到NameError: global name 'foo' is not defined
.
不是foo
本地的类MyClass
吗?
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()
.
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
foo 不是 MyClass 类的本地对象吗?
实际上,没有。class
它位于语句体的本地,bar
函数无法访问。一旦类对象创建并绑定到MyClass
,foo
就成为类对象的一个属性(就像bar
FWIW 一样),但那是命名空间,而不是作用域。
另外和 FWIW,Pythonstaticmethod
不访问类本身。如果您想要一个需要访问该类的方法,请改用 a classmethod
。
在 Python 中,“局部变量”的概念真正完全存在于函数中。类中的函数(方法)没有对类(或实例)范围的隐式访问;您必须明确指定包含所需属性的对象,即类或实例(按照约定传递给方法self
)。至于为什么要这样设计……你得问 Guido,但 Python 的禅宗说“显式胜于隐式”,所以这可能与它有关。
您需要这样做,因为 bar 函数是静态方法。这意味着您可以在不考虑包含类的实例的情况下调用它。IE 你不必创建类的实例来访问该函数。
您可以阅读更多关于它的信息 -在文档中