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