Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Python securite oridente objet ?

4 réponses
Avatar
David Josty
Bonjour,

J'étudie l'OO avec python... et je m'interroge sur un point.
Comment obliger le programmeur à passer par les fonctions de classes, et
lui interdire de modifie les valeurs directement, comme dans cet exemple ?

Merci



class Temperature:

# CONSTRUCTEUR
def __init__(self, laValeur):
self.valeur = laValeur

# OBVERVATEURS
def Afficher(self):
return self.valeur

# Exemple eauChaude = Temperature(310)
print eauChaude.Afficher()
eauChaude.valeur=12
print eauChaude.Afficher()

4 réponses

Avatar
J.Pierre Pourrez
Le Sun, 10 Apr 2005 14:19:18 +0200, David Josty a écrit :

Bonjour,

J'étudie l'OO avec python... et je m'interroge sur un point. Comment
obliger le programmeur à passer par les fonctions de classes, et lui
interdire de modifie les valeurs directement, comme dans cet exemple ?

Merci



class Temperature:

# CONSTRUCTEUR
def __init__(self, laValeur):
self.valeur = laValeur
self._valeur = lavaleur


# OBVERVATEURS
def Afficher(self):
return self.valeur
return self._valeur


# Exemple eauChaude = Temperature(310)
print eauChaude.Afficher()
eauChaude.valeur
print eauChaude.Afficher()


La protection n'est pas aussi efficace que en Delphi , C ou Java.
C'est plus une convention.
Néammoins un "dir(temperature)" n'affichera pas cet attribut.

Cordialement
Jean-Pierre

Avatar
Hervé Cauwelier
self._valeur = lavaleur


En fait, c'est deux soulignés qu'il faut mais ça ne fait que transformer
la variable en « _<classe>__attribut », ici « _Temperature__valeur ».

Je pense que pour des raisons d'introspection, les attributs ne sont
jamais vraiment cachés. Si un programmeur veut jouer au plus malin,
c'est son problème.

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
Gilles Lenfant
Bonjour,

J'étudie l'OO avec python... et je m'interroge sur un point.
Comment obliger le programmeur à passer par les fonctions de classes, et
lui interdire de modifie les valeurs directement, comme dans cet exemple ?

Merci



class Temperature:

# CONSTRUCTEUR
def __init__(self, laValeur):
self.valeur = laValeur

# OBVERVATEURS
def Afficher(self):
return self.valeur

# Exemple eauChaude = Temperature(310)
print eauChaude.Afficher()
eauChaude.valeur
print eauChaude.Afficher()




Pour contourner ça, on peut utiliser le builtin "property" pour
sécuriser l'accès aux attributs.


class Temperature:

# CONSTRUCTEUR
def __init__(self, laValeur):
self.valeur = laValeur

# OBVERVATEURS
def Afficher(self):
return self.valeur

def setValeur(self, valeur):
if type(valeur) is int:
self.__valeur = valeur
else:
raise ValueError("%s n'est pas une température" % str(valeur))

def getValeur(self):
return __valeur

valeur = property(getValeur, setValeur, "Valeur de la temperature")

Avatar
bruno modulix
David Josty wrote:
Bonjour,

J'étudie l'OO avec python... et je m'interroge sur un point.
Comment obliger le programmeur à passer par les fonctions de classes, et
lui interdire de modifie les valeurs directement, comme dans cet exemple ?


Quel est le cas d'utilisation ?

Si c'est parce qu'il doit y avoir des traitements suite à la mise à jour
de la valeur de l'attribut, utilise des propriétés (cf le post de Gilles).

Si c'est juste pour signaler au développeur que l'attribut ne fait pas
partie de l'API, la convention est de mettre un _ devant le nom. Tout
programmeur Python comprendra. Ca n'empêchera personne d'y accéder
directement, mais là ce n'est plus ton problème.

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"