和所有好的例子一样,您简化了实际要做的事情。这很好,但是值得注意的是python有一个罗得当涉及到类和实例变量时的灵活性。方法也是如此。要获得一个很好的可能性列表,我建议阅读迈克尔·弗茨的新式课程游戏攻略,特别是第2至6节。
在开始的时候,有一件事需要很多工作才能记住,那就是Python不是java。不仅仅是陈词滥调。在java中,编译了整个类,使命名空间解析变得非常简单:在方法(Anywhere)之外声明的任何变量都是实例(或者,如果是静态的)变量,并且可以在方法中隐式访问。
对于python,经验法则是有三个名称空间按照顺序搜索变量:功能/方法
当前模块
内建
{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 fooNameError: global name 'foo' is not defined
{end pedagogy}
最后,要记住的是做可以访问您想要访问的任何变量,但可能不能隐式访问。如果你的目标简单而直接,那么使用foo.bar或auto.bar就足够了。如果您的示例变得更加复杂,或者您想要做一些花哨的事情,比如继承(您可以继承静态/类方法!),或者在类本身中引用类的名称对您来说是错误的,请查看我链接的Introo。