具有继承性的Python单例

时间:2017-06-12 12:43:05

标签: python inheritance reference singleton

我有一个单身人士:

class ClassStn(BaseClass):
    INSTANCE = None

    def __init__(self, x1, args = None):
        if self.INSTANCE is not None:
            raise ValueError("An instantiation already exists!")

        # initializing
        BaseClass.__init__(self)
        self.x1 = x1
        self.args = args

    @classmethod
    def get_instance(cls, x1, args):
        if cls.INSTANCE is None:
            cls.INSTANCE = ClassStn(x1, args)
        return cls.INSTANCE

BaseClass也应该是单身人士吗?我担心继承非单例类的单例的引用可能搞砸了

1 个答案:

答案 0 :(得分:1)

即可。例如,假设您的BaseClassNameable:一个只指定对象具有名称的类。然后,您可以拥有名称为HumanCatDog的多个内容。但God例如是一个单身人士(在一神论宗教中)。那么God是单身,但Nameable不是。只有Nameable的一个实例应Nameable为单身。但这会使子类化变得怪异。

话虽这么说,单身人士通常被认为是反模式:这表明某些逻辑在你的程序中并不正确。所以在制作单身人物之前,你最好再三考虑是否有必要。

此外,如果您想要实现单例,可以覆盖__new__方法:

class ClassStn(BaseClass):

    INSTANCE = None

    def __init__(self, x1, args = None):
        super().__init__(self)
        self.x1 = x1
        self.args = args

    def __new__(cls,*args,**kwargs):
        if ClassStn.INSTANCE is None:
            ClassStn.INSTANCE = super().__new__(cls,*args,**kwargs)
        return ClassStn.INSTANCE

现在调用构造函数将第一次构造单例,并再次调用它,将引用返回到同一对象。所以:

x = ClassStn()
y = ClassStn()

会生成一个单身人士,而xy会引用该单身人士。

最后请注意,单例构造函数通常没有参数。因为这会破坏这些参数的目的:如果你根据一个参数的值构造一个对象,那么你只能构造一个对象很奇怪,因为不同的参数通常应该产生一个不同的对象。