2014-02-28 52 views
-3

这是一个相关的问题:How do I check if a variable exists?如何检查Python中是否存在静态变量?

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

我所要做的是以下,

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

好吧,既然A.var甚至没有分配。它会引发en错误。所以,我想这一点:

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中是否存在静态变量?

+2

Python没有静态变量,所以...你没有。 – geoffspear

+0

在python中没有这样的静态变量 - 一个类的变量简单地称为类变量。没有'空'(它被称为“无”)。另外,你正在寻找'hasattr'。 – l4mpi

+0

另外,如何在'__init__'函数调用之前分配一个类的属性? – Dunno

回答

5

无论您使用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' 

(请注意, proach是线程安全的)

+0

'try ... except'方法非常简单和容易我不明白为什么有人会寻找其他东西 – Dunno

+1

Upvoted for'hasattr',虽然我不同意喜欢try/except方法 - hasattr'更短,更可读和更明确。 – l4mpi

+0

经过多一点思考后,我认为EAFP的方法不仅仅是令人不快,而且在这种情况下是错误的。你没有做任何需要许可的事情,因为设置属性总是可能的(因为'A'对设置属性当然没有限制)。因此,您甚至必须使用无意义的语句,访问属性而不以任何方式使用它来测试“权限”。但实际上你只是想检查条件是否满足,条件是“属性x已被设置” - 直接转换为上面的if语句。 – l4mpi

相关问题