[PYTHON] Globalisation des variables d'instance de classe

Créons une variable d'instance de classe avec le modèle Singleton de Python afin qu'elle puisse être utilisée comme une variable globale.


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  #Ne pas initialiser après la deuxième fois

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

Résultat de l'exécution: ↓--------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>


Il peut être pratique d'utiliser la fonction @decorator pour créer plusieurs classes de modèles de singleton

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  #Ne pas initialiser après la deuxième fois

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

Résultat de l'exécution: 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

Globalisation des variables d'instance de classe
Python: variables de classe et d'instance
Variables de classe et d'instance Python
Variable de classe
Variable de classe
Ordre de référence des variables de classe et des variables d'instance dans "self. Variables de classe" en Python
[Python] classe, instance
Exemple d'utilisation de variables de classe et de méthodes de classe
[python] Obtenir une liste de variables d'instance
classe python, instance
À propos de la classe et de l'instance
Parallélisation de la méthode de classe
Déclaration des variables globales du langage C
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
Utilisation correcte de la méthode d'instance et de la méthode de classe
[Hikari-Python] Chapitre 09-03 Classe (Héritage)
Les mines terrestres cachées dans les variables de classe Python
Définitions de classe Python et gestion des instances
Calcul de la classe auto-fabriquée et de la classe existante
Comment accéder aux variables de classe?
[Python] Hériter d'une classe avec des variables de classe
Hit une méthode d'une instance de classe avec l'API Web Python Bottle