Python 延迟静态类成员初始化
我有以下(示例)代码: 问题是,函数Python 延迟静态类成员初始化,python,initialization,static-members,Python,Initialization,Static Members,我有以下(示例)代码: 问题是,函数bar()拒绝工作,除非先调用init()。对于这个问题,什么是好的Pythonesque解决方案 在我的特定情况下,init()是第三方的,不能进行修改,并且在不同的文件中调用,而不是定义一个a。像这样吗 class A: foo = None def __init__(self): if A.foo is None: A.foo = bar() print(A.foo) 如果您不
bar()
拒绝工作,除非先调用init()
。对于这个问题,什么是好的Pythonesque解决方案
在我的特定情况下,
init()
是第三方的,不能进行修改,并且在不同的文件中调用,而不是定义一个a
。像这样吗
class A:
foo = None
def __init__(self):
if A.foo is None:
A.foo = bar()
print(A.foo)
如果您不确定
A将调用if
语句,也可以将if
语句移动到A.\uuuu new\uuuuu()
。\uuuu init\uuuuuu()将被调用(例如,在显式调用构造函数之前取消对A
对象的调用)。您可以将对bar()的调用封装在另一个函数中,该函数也将确保init()
已被调用。这也是我一直在考虑的解决方案,但我认为一定有更好、更具Python风格的方法。据我所知,它只会让您避免出现异常<在调用init()
之前,code>foo在一段时间内可能具有None
值。您还建议将静态变量绑定到实例初始化。我认为更好的方法是简单地添加一个显式静态初始化函数,该函数设置foo=bar()
,任何函数如何确保调用了init()
,除了调用它本身?这取决于你所说的“拒绝工作”的意思,如果它抛出异常,你可以捕获它。如果它返回None
,您可以检查它,依此类推。这里需要更多的细节。期望的行为是什么?它引发异常。但是你能用它做什么?在这种情况下你想发生什么?如果你只想避免这种情况,你真的能确保在调用init()
之前不使用static吗?没有像Sven Marnach建议的那样的构造。顺便说一句,如果你需要延迟初始化直到A
初始化,那么foo
就不是真正的static,而是一个单例。foo真的有必要成为类属性吗?我怀疑你最好重新设计这一部分。好吧,这个类是一个字符
,静态属性是字符.sprite
。它是所有字符
实例中常见的一件事,并且关系密切,因此静态成员属性似乎是最好的。在库初始化之前,我使用的库无法从文件加载精灵。
class A:
foo = None
def __init__(self):
if A.foo is None:
A.foo = bar()
print(A.foo)