Traitez les variables de classe Python comme des variables privées

Dans les programmes suivants, le test des variables en classe peut être manipulé de l'extérieur, ce qui peut provoquer des bogues.

class MyClass(object):

    def __init__(self):
        self.test = 'test'


t = MyClass()
print(t.test)

#Peut être édité directement
t.test = 'test2'
print(t.test)
test
test2

~~ Vous pouvez rendre impossible l'édition de l'extérieur en ajoutant un double trait de soulignement à la variable dans la fonction. ~~ Même avec un double trait de soulignement, il semble que vous puissiez éditer sous la forme suivante sans utiliser de setter.

class MyClass(object):

    def __init__(self):
        self.__test = 'test'

    @property
    def test(self):
          return self.__test


t = MyClass()
print(t.test)

#Modifier sans utiliser setter
t._MyClass__test = 'test2'
print(t._MyClass__test)

#Ne peut pas être édité normalement
t.__test = 'test3'
print(t.test)
test
test2
test2

Dans pep8, il est écrit comme suit: "En général, les doubles traits de soulignement ne doivent être utilisés que pour éviter les conflits de nom avec les attributs des classes conçues pour être sous-classées." Cela ne semble pas recommandé. Si vous voulez en faire une variable privée, la méthode correcte consiste à ajouter un seul trait de soulignement au début pour indiquer qu'il s'agit d'une variable privée.

class MyClass(object):

    def __init__(self):
        self._test = 'test'
        
    @property
    def test(self):
        return self._test
    
    @test.setter
    def test(self, value):
        self._test = value


t = MyClass()
print(t.test)

#Modifier à l'aide du setter
t.test = 'test2'
print(t.test)
test
test2

Il convient de noter que vous pouvez réellement éditer et utiliser sans utiliser le setter.

class MyClass(object):

    def __init__(self):
        self._test = 'test'
        
    @property
    def test(self):
        return self._test
    
    @test.setter
    def test(self, value):
        self._test = value


t = MyClass()
print(t.test)

#Modifier à l'aide du setter
t.test = 'test2'
print(t.test)

#Modifier sans utiliser setter
t._test = 'test3'
print(t._test)

Recommended Posts

Traitez les variables de classe Python comme des variables privées
[Python] Variables
python Remarque: Traitez les listes collectivement comme un ensemble
(Python) Traite les valeurs entières comme un ensemble d'indicateurs
Procédure d'apprentissage privée Python
Python: variables de classe et d'instance
À propos des variables et des objets Python
notes python pour l'utilisation de variables spéciales perl
Gérer les variables d'environnement en Python
# 1 [python3] Calcul simple à l'aide de variables
Variables de classe et d'instance Python
Guide du débutant Python (Variations / Tableaux)
Variables Python et ID d'objet
python: utilisez les variables définies dans le format de chaîne telles quelles