【问题标题】:How do I check if a static variable exists in Python?如何检查 Python 中是否存在静态变量?
【发布时间】:2014-02-28 14:51:04
【问题描述】:

这是一个相关问题:How do I check if a variable exists?

但是,它不适用于静态变量。

我想做的是以下,

class A:
    def __init__(self):
        if A.var is null: # this does not work, okay
            A.var = 'foo'
            print 'assigned'

好的,因为 A.var 甚至没有被分配。它引发了错误。所以,我尝试了这个:

class A:
    def __init__(self):
        if 'A.var' not in globals(): # this seems to okay, but ..
            A.var = 'foo'
            print 'assigned'

a = A()
b = A()

结果:

assigned
assigned

这表明if 'A.var' not in globals(): 行无法正常工作。

那么,如何检查 Python 中是否存在静态变量?

【问题讨论】:

  • Python 没有静态变量,所以……你没有。
  • python 中没有静态变量之类的东西——类上的变量简称为类变量。也没有null(称为None)。另外,您正在寻找hasattr
  • 另外,如何在__init__函数调用之前分配一个类的属性?
  • 技术上A.var是一个类变量,而不是一个静态变量。

标签: python static-members


【解决方案1】:

要么你使用hasattr

if not hasattr(A, 'var'):
    A.var = 'foo'

或者,根据“请求宽恕比许可更容易”原则,有些人更愿意:

try:
    A.var
except NameError:
    A.var = 'foo'

最后,你可以简单地在类体中定义默认值:

class A(object):
    var = None
    ...

if A.var is None:
    a.var = 'foo'

(请注意,这两种方法都不是线程安全的)

【讨论】:

  • try... except 方法如此简单明了,我不明白为什么有人会寻找其他东西
  • 赞成hasattr,尽管我不同意try/except 的做法——hasattr 更短、更易读、更明确。
  • 经过深思熟虑后,我认为 EAFP 方法不仅令人不快,而且在这种情况下完全是错误的。你没有做任何需要许可的事情,因为设置属性总是可能的(当然A 对设置属性没有限制)。因此,您甚至必须使用无意义的语句,在不以任何方式使用属性的情况下访问属性,来测试“权限”。但实际上你只是想检查一个条件是否满足,条件是“属性 x 已被设置”——直接转化为上面的 if 语句。
  • @l4mpi 是的,显然,在这种情况下你是对的。另一方面,如果我们有一个函数而不是返回 A.var 并在它缺失时设置属性,try...catch 会更有意义。
猜你喜欢
  • 1970-01-01
  • 2011-05-20
  • 2010-10-25
  • 1970-01-01
  • 2014-01-30
  • 2012-07-05
  • 2011-08-18
  • 1970-01-01
相关资源
最近更新 更多