在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.bar
或Foo.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:
- 函数/方法
- 当前模块
- 内置命令
{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()