繁体   English   中英

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

[英]How to create a static instance of a class inside the same class?

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

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

我需要这个的原因是因为稍后我想通过例如 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 s。

这被称为单例设计模式。 它在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 中是首选的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM