我有一个数据类,它包含如下示例中的一些属性。
如何创建类的静态实例并将其作为同一类的一部分?
我需要这样做的原因是,以后我想访问这些字段,例如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中是首选的。