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

So implementieren Sie ein Singleton-Muster in Python

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼Original
2019-06-22 09:28:412618Durchsuche

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))

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!

Stellungnahme:
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