在Python中,如何在类方法中访问“静态”类变量

2024-09-30 01:20:03 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有以下python代码:

class Foo(object):
    bar = 1

    def bah(self):
        print(bar)

f = Foo()
f.bah()

它抱怨

NameError: global name 'bar' is not defined

如何在方法bah中访问类/静态变量bar


Tags: 代码nameselfobjectfooisdefnot
3条回答

使用self.barFoo.bar代替bar。赋值给Foo.bar将创建一个静态变量,赋值给self.bar将创建一个实例变量。

和所有好的例子一样,你已经简化了你真正想要做的事情。这很好,但值得注意的是,当谈到类与实例变量时,python有很多灵活性。方法也是如此。为了获得一个很好的可能性列表,我建议阅读Michael Fötsch' new-style classes introduction,特别是第2到6节。

在开始时,要记住一件事,那就是python不是java,而不仅仅是陈词滥调。在java中,编译整个类,使名称空间解析变得非常简单:在方法外部(任何地方)声明的任何变量都是实例(或者,如果是静态的,则是类)变量,并且可以在方法内部隐式访问。

对于python,经验法则是,有三个名称空间按顺序搜索变量:

  1. 功能/方法
  2. 当前模块
  3. 内置

{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}

最后,需要记住的是,您可以访问任何您想要访问的变量,但可能不是隐式的。如果你的目标简单明了,那么选择Foo.bar或self.bar就足够了。如果你的例子越来越复杂,或者你想做一些有趣的事情,比如继承(你可以继承静态/类方法!),或者在类本身中引用类名称的想法对您来说似乎是错误的,请查看我链接的简介。

定义类方法:

class Foo(object):
    bar = 1
    @classmethod
    def bah(cls):    
        print cls.bar

现在,如果bah()必须是实例方法(即有权访问self),则仍然可以直接访问类变量。

class Foo(object):
    bar = 1
    def bah(self):    
        print self.bar

相关问题 更多 >

    热门问题