就像所有的好例子一样,你简化了你实际想要做的事情。这很好,但值得注意的是,python在类和实例变量方面有很大的灵活性。方法也是如此。为了获得很好的可能性,我建议阅读Michael Fötsch' new-style classes introduction,特别是第2至6部分。
在开始时需要记住很多工作的一件事是python不是java。不仅仅是陈词滥调。在java中,编译整个类,使命名空间的解析变得非常简单:任何在方法外(任何地方)声明的变量都是实例(或者,如果是静态的,类)变量,并且可以在方法中隐式访问。
使用python,宏伟的经验法则是有三个名字空间按顺序搜索变量:
函数/方法
当前模块
内置命令 LI>
{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 "", line 1, in
class B(object):
File "", line 5, in B
bar = get_foo()
File "", line 4, in get_foo
return foo
NameError: global name 'foo' is not defined{end pedagogy}
最后,需要记住的是,您可以访问任何您想要访问的变量,但可能不会隐式地访问。如果你的目标简单明了,那么去Foo.bar或self.bar可能就足够了。如果你的例子变得越来越复杂,或者你想做一些像继承一样的花哨的东西(你可以继承静态/类方法!),或者在类中引用你的类的名字的想法对你来说似乎是错误的,请检查介绍我链接。