如果我有以下python代码:
class Foo(object):
bar = 1
def bah(self):
print(bar)
f = Foo()
f.bah()
Run Code Online (Sandbox Code Playgroud)
它抱怨
NameError: global name 'bar' is not defined
Run Code Online (Sandbox Code Playgroud)
如何bar
在方法中访问类/静态变量bah
?
小智 145
而不是bar
使用self.bar
或Foo.bar
.分配Foo.bar
将创建一个静态变量,并且分配self.bar
将创建一个实例变量.
var*_*tec 76
定义类方法:
class Foo(object):
bar = 1
@classmethod
def bah(cls):
print cls.bar
Run Code Online (Sandbox Code Playgroud)
现在如果bah()
必须是实例方法(即可以访问self),您仍然可以直接访问类变量.
class Foo(object):
bar = 1
def bah(self):
print self.bar
Run Code Online (Sandbox Code Playgroud)
Dav*_*ger 11
与所有好的例子一样,您已经简化了实际尝试的内容.这很好,但值得注意的是,python 在类与实例变量方面具有很大的灵活性.方法也是如此.对于一系列可能性,我建议阅读MichaelFötsch的新式课程介绍,尤其是第2至第6部分.
入门时需要记住很多工作的一件事是python不是java. 不仅仅是陈词滥调.在java中,编译整个类,使命名空间解析变得非常简单:在方法外(任何地方)声明的任何变量都是实例(或者,如果是静态的,类)变量,并且可以在方法中隐式访问.
使用python,经验法则是有三个命名空间按顺序搜索变量:
{begin pedagogy}
这个例外有限.我遇到的主要问题是,当加载类定义时,类定义是它自己的隐式命名空间.但这只有在加载模块时才会持续,并且在方法中完全被绕过.从而:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
Run Code Online (Sandbox Code Playgroud)
但:
>>> 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
Run Code Online (Sandbox Code Playgroud)
{end pedagogy}
最后,要记住的是,你就可以访问任何你想要访问的变量,但可能不会含蓄.如果你的目标简单明了,那么去Foo.bar或self.bar可能就足够了.如果你的例子变得越来越复杂,或者你想做继承等花哨的东西(你可以继承静态/类方法!),或者在类中引用你的类名称的想法本身似乎不对,请查看介绍我联系.
class Foo(object):
bar = 1
def bah(self):
print Foo.bar
f = Foo()
f.bah()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
138045 次 |
最近记录: |