>>> 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
和所有好的例子一样,您已经简化了您实际要做的事情。这很好,但值得注意的是,python在类变量与实例变量之间具有很大的灵活性。方法也是如此。要获得一个好的可能性列表,我建议阅读Michael Fötsch' new-style classes introduction,特别是第2节到第6节
开始使用python时要记住的一点是,python不是java。不仅仅是陈词滥调。在java中,编译整个类,使名称空间解析变得非常简单:在方法(任何位置)之外声明的任何变量都是实例(或者,如果是静态的,则是类)变量,并且在方法内可以隐式访问
对于python,主要的经验法则是有三个名称空间按顺序搜索变量:
{begin pedagogy}
这方面的例外情况有限。我想到的主要问题是,当加载类定义时,类定义是它自己的隐式命名空间。但这只会在加载模块时持续,并且在方法中完全被绕过。因此:
但是:
{end pedagogy}
最后,要记住的是,确实可以访问任何想要访问的变量,但可能不是隐式的。如果你的目标简单明了,那么选择Foo.bar或self.bar就足够了。如果您的示例变得越来越复杂,或者您想做一些奇特的事情,比如继承(您可以继承静态/类方法!),或者在类本身中引用类名称的想法对您来说似乎是错误的,请查看我链接的简介
定义类方法:
现在,如果
bah()
必须是实例方法(即访问self),您仍然可以直接访问类变量使用
self.bar
或Foo.bar
代替bar
。赋值给Foo.bar
将创建一个静态变量,赋值给self.bar
将创建一个实例变量相关问题 更多 >
编程相关推荐