Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 延迟静态类成员初始化_Python_Initialization_Static Members - Fatal编程技术网

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)