首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python的方法中访问“静态”类变量?

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

Stack Overflow用户
提问于 2009-04-01 21:23:40
回答 5查看 199.8K关注 0票数 208

如果我有以下代码:

代码语言:javascript
复制
class Foo(object):
    bar = 1

    def bah(self):
        print(bar)
        
f = Foo()
f.bah()

它会抱怨

NameError:未定义全局名称'bar‘

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-01 21:25:28

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

票数 216
EN

Stack Overflow用户

发布于 2009-04-02 09:42:57

定义类方法:

代码语言:javascript
复制
class Foo(object):
    bar = 1
    @classmethod
    def bah(cls):    
        print cls.bar

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

代码语言:javascript
复制
class Foo(object):
    bar = 1
    def bah(self):    
        print self.bar
票数 108
EN

Stack Overflow用户

发布于 2009-04-02 05:13:03

与所有优秀的示例一样,您已经简化了实际要做的事情。这很好,但值得注意的是,当涉及到类变量与实例变量时,python具有很大的灵活性。同样的道理也适用于方法。要获得一个很好的可能性列表,我建议阅读Michael Fötsch' new-style classes introduction,特别是第2到6节。

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

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

function/method

  • The current module

  • Builtins

{begin pedagogy}

这方面的例外是有限的。我想到的主要一个问题是,当加载类定义时,类定义是它自己的隐式名称空间。但是这只在模块被加载的时候持续,并且在方法中被完全绕过。因此:

代码语言:javascript
复制
>>> class A(object):
        foo = 'foo'
        bar = foo


>>> A.foo
'foo'
>>> A.bar
'foo'

但是:

代码语言:javascript
复制
>>> 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可能就足够了。如果你的例子变得越来越复杂,或者你想做一些花哨的事情,比如继承(你可以继承static/class方法!),或者在类本身中引用你的类名的想法对你来说似乎是错误的,看看我链接的介绍。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/707380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档