Wie implementiert man ein Singleton-Muster in Python? Hier sind sieben verschiedene Methoden für Sie:
1: staticmethod
Der Code lautet wie folgt:
class Singleton(object): instance = None def __init__(self): raise SyntaxError('can not instance, please use get_instance') def get_instance(): if Singleton.instance is None: Singleton.instance = object.__new__(Singleton) return Singleton.instance a = Singleton.get_instance() b = Singleton.get_instance() print('a id=', id(a)) print('b id=', id(b))
Diese Methode Der entscheidende Punkt besteht darin, eine Ausnahme in __init__ auszulösen, die Instanziierung über Klassen zu verbieten und Instanzen nur über die statische Funktion get_instance abzurufen, da sie nicht über Klassen instanziiert werden kann. Die statische Funktion get_instance kann über das übergeordnete Klassenobjekt abgerufen werden.__new__ Instanziieren.
Zwei: Klassenmethode
Ähnlich wie Methode eins, Code:
class Singleton(object): instance = None def __init__(self): raise SyntaxError('can not instance, please use get_instance') def get_instance(cls): if Singleton.instance is None: Singleton.instance = object.__new__(Singleton) return Singleton.instance a = Singleton.get_instance() b = Singleton.get_instance() print('a id=', id(a)) print('b id=', id(b))
Der Hauptzweck dieser Methode besteht darin, eine Ausnahme in __init__ auszulösen und zu verbieten Um eine Klasse zu instanziieren, kann die Instanz nur über die statische get_instance-Funktion abgerufen werden. Da sie nicht über eine Klasse instanziiert werden kann, kann die statische get_instance-Funktion über das übergeordnete Klassenobjekt instanziiert werden.__new__.
Drei: Die Klassenattributmethode
ähnelt Methode eins, Code:
class Singleton(object): instance = None def __init__(self): raise SyntaxError('can not instance, please use get_instance') def get_instance(): if Singleton.instance is None: Singleton.instance = object.__new__(Singleton) return Singleton.instance a = Singleton.get_instance() b = Singleton.get_instance() print(id(a)) print(id(b))
Der Hauptzweck dieser Methode besteht darin, eine Ausnahme auszulösen __init__, Es ist verboten, über eine Klasse zu instanziieren, und die Instanz kann nur über die statische get_instance-Funktion abgerufen werden, da sie nicht über eine Klasse instanziiert werden kann. Die statische get_instance-Funktion kann über das übergeordnete Klassenobjekt instanziiert werden.__new__.
Vier: __new__
Gemeinsame Methoden, der Code lautet wie folgt:
class Singleton(object): instance = None def __new__(cls, *args, **kw): if not cls.instance: # cls.instance = object.__new__(cls, *args) cls.instance = super(Singleton, cls).__new__(cls, *args, **kw) return cls.instance a = Singleton() b = Singleton() print(id(a)) print(id(b))
Verwandte Empfehlungen: „Python-Video-Tutorial "
Fünf: Dekorateur
Der Code lautet wie folgt:
def Singleton(cls): instances = {} def getinstance(): if cls not in instances: instances[cls] = cls() return instances[cls] return getinstance class MyClass: pass a = MyClass() b = MyClass() c = MyClass() print(id(a)) print(id(b)) print(id(c))
Sechs: Metaklasse
Python2-Version:
class Singleton(type): def __init__(cls, name, bases, dct): super(Singleton, cls).__init__(name, bases, dct) cls.instance = None def __call__(cls, *args): if cls.instance is None: cls.instance = super(Singleton, cls).__call__(*args) return cls.instance class MyClass(object): __metaclass__ = Singleton a = MyClass() b = MyClass() c = MyClass() print(id(a)) print(id(b)) print(id(c)) print(a is b) print(a is c)
oder:
class Singleton(type): def __new__(cls, name, bases, attrs): attrs["_instance"] = None return super(Singleton, cls).__new__(cls, name, bases, attrs) def __call__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(Singleton, cls).__call__(*args, **kwargs) return cls._instance class Foo(object): __metaclass__ = Singleton x = Foo() y = Foo() print(id(x)) print(id(y))
Python3-Version:
class Singleton(type): def __new__(cls, name, bases, attrs): attrs['instance'] = None return super(Singleton, cls).__new__(cls, name, bases, attrs) def __call__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super(Singleton, cls).__call__(*args, **kwargs) return cls.instance class Foo(metaclass=Singleton): pass x = Foo() y = Foo() print(id(x)) print(id(y))
Sieben: Namensabdeckung
Der Code lautet wie folgt:
class Singleton(object): def foo(self): print('foo') def __call__(self): return self Singleton = Singleton() Singleton.foo() a = Singleton() b = Singleton() print(id(a)) print(id(b))
Das obige ist der detaillierte Inhalt vonSo implementieren Sie ein Singleton-Muster in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!