[PYTHON] Globalisierung von Klasseninstanzvariablen

Erstellen wir eine Klasseninstanzvariable mit Pythons Singleton-Muster, damit sie wie eine globale Variable verwendet werden kann.


singleton01.py


class MySingleton(object):
    __obj = None
    __init_flg = True

    def __new__(cls, *args, **kwargs):
        if cls.__obj is None:
            cls.__obj = super().__new__(cls, *args)
        return cls.__obj

    def __init__(self):
        if self.__init_flg:
            self._x = 0
            self.__init_flg = False  #Initialisieren Sie nicht nach dem zweiten Mal

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value


def use_singleton1():
    print('↓--------use_singleton1')
    a1 = MySingleton()
    print('MySingleton(a1) property x = {}'.format(a1.x))
    a1.x = 150
    print('MySingleton(a1) property x = {}'.format(a1.x))
    print(a1)


def use_singleton2():
    print('↓--------use_singleton2')
    b1 = MySingleton()
    print('MySingleton(b1) property x = {}'.format(b1.x))
    b1.x = 250
    print('MySingleton(b1) property x = {}'.format(b1.x))
    print(b1)


use_singleton1()
use_singleton2()

Ausführungsergebnis: ↓--------use_singleton1 MySingleton(a1) property x = 0 MySingleton(a1) property x = 150 <main.MySingleton object at 0x00000000010C22B0> ↓--------use_singleton2 MySingleton(b1) property x = 150 MySingleton(b1) property x = 250 <main.MySingleton object at 0x00000000010C22B0>


Es kann zweckmäßig sein, die @ decorator-Funktion zu verwenden, um mehrere Singleton-Musterklassen zu erstellen

singleton02.py


def singleton(cls, *args, **kwargs):
    obj = None

    def wrapper():
        nonlocal obj
        if obj is None:
            obj = cls(*args, **kwargs)
        return obj
    return wrapper

@singleton
class MySingleton(object):
    __init_flg = True

    def __init__(self):
        if self.__init_flg:
            self._x = 0
            self.__init_flg = False  #Initialisieren Sie nicht nach dem zweiten Mal

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

@singleton
class MySingleton2(object):
    pass


a = MySingleton()
a.x = 11
b = MySingleton()
print('MySingleton(b) property x = {}'.format(b.x))
b.x = 12
print('MySingleton(a) property x = {}'.format(a.x))
print('MySingleton(b) property x = {}'.format(b.x))
print(a)
print(b)
print('----------------------------------------------------------')
a2 = MySingleton2()
b2 = MySingleton2()
print(a2)
print(b2)

Ausführungsergebnis: MySingleton(b) property x = 11 MySingleton(a) property x = 12 MySingleton(b) property x = 12 <main.MySingleton object at 0x0000000000B820B8> <main.MySingleton object at 0x0000000000B820B8> ---------------------------------------------------------- <main.MySingleton2 object at 0x0000000000B821D0> <main.MySingleton2 object at 0x0000000000B821D0>


Recommended Posts

Globalisierung von Klasseninstanzvariablen
Python: Klassen- und Instanzvariablen
Python-Klassen- und Instanzvariablen
Klassenvariable
Referenzreihenfolge von Klassenvariablen und Instanzvariablen in "self. Klassenvariablen" in Python
[Python] -Klasse, Instanz
Beispiel für die Verwendung von Klassenvariablen und Klassenmethoden
[Python] Ruft eine Liste der Instanzvariablen ab
Python-Klasse, Instanz
Über Klasse und Instanz
Parallelisierung der Klassenmethode
Deklaration globaler Variablen der C-Sprache
Erstellen Sie eine Instanz einer vordefinierten Klasse aus einer Zeichenfolge in Python
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Ordnungsgemäße Verwendung der Instanzmethode und der Klassenmethode
[Hikari-Python] Kapitel 09-03 Klasse (Vererbung)
In Python-Klassenvariablen versteckte Landminen
Python-Klassendefinitionen und Instanzbehandlung
Berechnung der selbst erstellten Klasse und der vorhandenen Klasse
Wie soll ich auf Klassenvariablen zugreifen?
[Python] Erbt eine Klasse mit Klassenvariablen
Treffen Sie eine Methode einer Klasseninstanz mit der Python Bottle Web API