1 回答
TA贡献1808条经验 获得超4个赞
单例模式在 Python 中毫无意义。几乎总是,你最好使用模块。或者一些工厂功能作为您的主要构造 API,例如 .getLogger
如果你真的坚持让你的类表面上成为一个单例(这总是可以被颠覆的),我建议元类方法,因为它回避了覆盖的各种复杂性,尽管元类引入了自己的复杂性。__new__
但是为了解决您的问题,这段代码已经过时了,将参数传递给现在将抛出错误,而不是简单地忽略。要完成这项工作,只需不要将任何参数传递给__new__
:object.__new__
In [1]: class Singleton(object):
...: _instance = None
...: def __new__(class_, *args, **kwargs):
...: if not isinstance(class_._instance, class_):
...: class_._instance = object.__new__(class_)
...: return class_._instance
...:
In [2]: class Test(Singleton):
...: def __init__(self, name=None):
...: print(name)
...:
...: test1 = Test('a')
a
注意,每次“实例化”单例时都会调用:__init__
In [3]: test2 = Test('b')
b
In [4]: test1 is test2
Out[4]: True
这可能是可取的,也可能是不可取的。
但是认真地重新考虑您是否需要单例课程。即使在有意义的语言中,例如Java,它们通常也是一种反模式,并且只是在OOP封装的外观中隐藏可变全局状态的一种方式。这再次使我想到了仅使用模块的原始建议,那么您没有任何借口。
添加回答
举报