在Python中,如何访问类方法中的“静态”类variables

如果我有以下的Python代码:

class Foo(object): bar = 1 def bah(self): print bar f = Foo() f.bah() 

它抱怨

 NameError: global name 'bar' is not defined 

如何在方法'bah'中访问类/静态variables'bar'?

而不是bar使用self.barFoo.bar 。 赋值给Foo.bar会创build一个静态variables,赋值给self.bar将会创build一个实例variables。

定义类的方法:

 class Foo(object): bar = 1 @classmethod def bah(cls): print cls.bar 

现在,如果bah()必须是实例方法(即有权访问自己),您仍然可以直接访问类variables。

 class Foo(object): bar = 1 def bah(self): print self.bar 

就像所有的好例子一样,你简化了你实际想要做的事情。 这很好,但是值得注意的是,python在类和实例variables方面有很大的灵活性。 方法也可以这样说。 对于一个很好的可能性列表,我build议您阅读MichaelFötsch的新式课程介绍 ,特别是第二至六章 。

有一点需要记住很多工作要记住,是python不是java。 不仅仅是一个陈词滥调。 在java中,编译整个类,使命名空间的parsing变得非常简单:任何在方法(任何地方)外声明的variables都是实例(或者,如果是静态类)variables,并且可以在方法中隐式访问。

使用python,macros伟的经验法则是有三个名字空间按顺序searchvariables:

  1. 函数/方法
  2. 当前模块
  3. 内置命令

{begin pedagogy}

这是有限的例外。 我发现的主要问题是,当加载类定义时,类定义是它自己的隐式名称空间。 但是,只有在模块被加载的时候,它才会持续下去,并且在一个方法中完全被忽略。 从而:

 >>> class A(object): foo = 'foo' bar = foo >>> A.foo 'foo' >>> A.bar 'foo' 

但:

 >>> class B(object): foo = 'foo' def get_foo(): return foo bar = get_foo() Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> class B(object): File "<pyshell#11>", line 5, in B bar = get_foo() File "<pyshell#11>", line 4, in get_foo return foo NameError: global name 'foo' is not defined 

{end pedagogy}

最后,要记住的是,你可以访问你想要访问的任何variables,但可能不会隐含。 如果你的目标简单明了,那么去Foo.bar或self.bar就足够了。 如果你的例子变得越来越复杂了,或者你想做一些像inheritance的东西(你可以inheritance静态/类方法!),或者在类中引用你的类的名字的想法对你来说似乎是错误的,那么检查一下介绍我链接。

 class Foo(object): bar = 1 def bah(self): print Foo.bar f = Foo() f.bah()