Heim > Backend-Entwicklung > Python-Tutorial > So implementieren Sie ein Singleton-Muster in Python

So implementieren Sie ein Singleton-Muster in Python

爱喝马黛茶的安东尼
Freigeben: 2019-06-22 09:28:41
Original
2628 Leute haben es durchsucht

So implementieren Sie ein Singleton-Muster in Python

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))
Nach dem Login kopieren

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))
Nach dem Login kopieren

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))
Nach dem Login kopieren

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))
Nach dem Login kopieren

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))
Nach dem Login kopieren

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)
Nach dem Login kopieren

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))
Nach dem Login kopieren

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))
Nach dem Login kopieren

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))
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage