如何在同一个类中创建一个类的静态实例?



我有一个数据类,它包含如下示例中的一些属性。

如何创建类的静态实例并将其作为同一类的一部分?

我需要这样做的原因是,以后我想访问这些字段,例如TestClass.STATIC_INSTANCE1.attribute1.

@dataclass
class TestClass:
attribute1: str
attribute2: int

STATIC_INSTANCE1 = TestClass("instance1", 1)
STATIC_INSTANCE2 = TestClass("instance2", 1)

这样做通常是不被允许的,因为它创建了循环引用,特别是当您在函数内部动态生成类时,会产生问题。

如果这不是你的情况,你可以这样创建:

@dataclass
class TestClass:
attribute1: str
attribute2: int

TestClass.STATIC_INSTANCE1 = TestClass("instance1", 1)
TestClass.STATIC_INSTANCE2 = TestClass("instance2", 1)

我建议你避免这样做,只是在类之外定义STATIC_INSTANCE1,但它将需要在用户端额外的from...import

这就是所谓的单例设计模式。它在Java中使用最广泛,据我所知,教科书上的实现是在必要时使用方法初始化静态实例,并获得该静态实例:

@dataclass
class TestClass:
attribute1: str
attribute2: int
_STATIC_INSTANCE1 = None
_STATIC_INSTANCE2 = None
@staticmethod
def get_static_instance1():
if TestClass._STATIC_INSTANCE1 is None:
TestClass._STATIC_INSTANCE1 = TestClass("instance1", 1)
return TestClass._STATIC_INSTANCE1
# ditto for static instance 2

然而,由于与Java不同,python允许自由浮动对象(并非所有内容都需要是类),请考虑这些静态实例是否实际上需要绑定到TestClass本身,或者它们是否可以在同一个文件中浮动:


@dataclass
class TestClass:
attribute1: str
attribute2: int
...
pass
STATIC_INSTANCE1 = TestClass("instance1", 1)
STATIC_INSTANCE2 = TestClass("instance2", 1)
# import STATIC_INSTANCE1 and STATIC_INSTANCE2 from the same file as TestClass, 
# but separately

如果可能,后一种方法在Python中是首选的。

相关内容

  • 没有找到相关文章