我有一个单身人士:
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
也应该是单身人士吗?我担心继承非单例类的单例的引用可能搞砸了
答案 0 :(得分:1)
否即可。例如,假设您的BaseClass
是Nameable
:一个只指定对象具有名称的类。然后,您可以拥有名称为Human
,Cat
,Dog
的多个内容。但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()
会生成一个单身人士,而x
和y
会引用该单身人士。
最后请注意,单例构造函数通常没有参数。因为这会破坏这些参数的目的:如果你根据一个参数的值构造一个对象,那么你只能构造一个对象很奇怪,因为不同的参数通常应该产生一个不同的对象。