__new__
特別なメソッドの実装
class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
def __init__(self, name):
self.name = name
s1 = Singleton('first')
s2= Singleton('last')
print(s1 == s2)
>> True
print(s1.name)
>> last
ヒント:new__
メソッドはトリガーを回避できません。__init()
最初のメンバー変数は上書きされます
デコレータの実装
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def singleton(cls):
_instance = {
}
def inner(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls(*args, **kwargs)
return _instance[cls]
return inner
@singleton
class Test:
def __init__(self, name):
self.name = name
t1 = Test('first')
t2 = Test('last')
print(t1==t2)
>> True
print(t2.name)
>> first
クラスデコレータの実装
class Singleton:
def __init__(self, cls):
self._cls = cls
self._instance = {
}
def __call__(self, *args):
if self._cls not in self._instance:
self._instance[self._cls] = self._cls(*args)
return self._instance[self._cls]
@Singleton
class Cls2:
def __init__(self, name):
self.name = name
cls1 = Cls2('first')
cls2 = Cls2('last')
print(id(cls1) == id(cls2))
>> True
print(cls1.name)
>> first
メタクラスの実装
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Singleton1(type):
def __init__(self, *args, **kwargs):
self.__instance = None
super(Singleton1, self).__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
if self.__instance is None:
self.__instance = super(Singleton1, self).__call__(*args, **kwargs)
return self.__instance
class C(metaclass=Singleton1):
def __init__(self, name):
self.name = name
c1 = C('first')
c2 = C('last')
print(c1 == c2)
>> True
print(c2.name)
>> first
モジュールの実装
Pythonモジュールは、モジュールが最初にインポートされたときに.pycファイルを生成するため、自然なシングルトンモードです。2回目にインポートされたとき、.pycファイルはモジュールコードを再度実行せずに直接ロードされます。 。
#foo1.py
class Singleton(object):
def foo(self):
pass
singleton = Singleton()
#foo.py
from foo1 import singleton