2011-10-25 42 views
1

我有这样的(例子)代码:类时滞静态类成员初始化

init() 

class A: 
    foo = bar() 

    def __init__(self): 
     print(A.foo) 

的问题是,该功能bar()拒绝工作,除非init()已经首先被调用。什么是一个很好的pythonesque解决方案这个问题?


在我的具体情况init()是第三方,不能进行调整,被称为在不同的文件比A定义。

+0

顺便说一句,如果你需要,直到'A'初始化延迟初始化,然后'foo'是不是真的静态的,而是一个单身。 –

+2

foo真的有必要成为一个类属性吗?我怀疑你最好重新设计这部分设计。 –

+0

那么,这个类是一个'Character',静态属性是'Character.sprite'。这是所有'Character'实例中的一个常见事物,并且密切相关,因此静态成员属性看起来最好。我使用的库在库初始化之前无法从文件加载精灵。 – orlp

回答

0

喜欢这个?

class A: 
    foo = None 
    def __init__(self): 
     if A.foo is None: 
      A.foo = bar() 
     print(A.foo) 

你也可以移动的if声明A.__new__()如果你不知道A.__init__()将被调用(如显式调用构造函数之前取储存的A对象时)。

+0

这也是我也在考虑的解决方案,但我认为必须有更好的更加Pythonesque的方式。 – orlp

+0

据我了解,它只会让你免受异常。在调用init()之前,'foo'可能会有'None'值一段时间。您还建议将一个静态变量绑定到实例初始化。我认为更好的方法是简单地添加一个明确的静态初始化函数来设置'foo = bar()' – Xyand

0

您可以在另一个函数中将呼叫打包为bar(),这将确保已调用init()

+0

除了自己调用它之外,任何函数如何确保调用了init()? – orlp

+0

这取决于你所说的'拒绝工作',如果它抛出一个异常,你可以捕捉它。如果它返回'None',你可以检查它,等等。这里需要更多细节。期望的行为是什么? – Xyand

+0

它引发异常。但你可以用它做什么? – orlp