Vous pouvez fa­ci­le­ment attribuer des valeurs aux attributs d’une classe Python en utilisant Python Property. Les méthodes getter ou setter sont appelées au­to­ma­ti­que­ment lorsque vous utilisez Python Property.

Python Property : de quoi s’agit-il exac­te­ment et à quoi sert cette solution ?

La solution Python Property relève d’une technique que les dé­ve­lop­peurs peuvent utiliser dans le cadre de la pro­gram­ma­tion orientée objet avec Python. Les pro­gram­meurs peuvent ainsi définir des méthodes dont ils peuvent ensuite disposer comme s’il s’agissait d’attributs. Cela leur permet d’accéder de manière plus intuitive aux attributs d’une classe. L’appel des méthodes dédiées setter et getter devient ainsi superflu. La solution Python Property permet de trans­for­mer les attributs de classe en pro­prié­tés appelées « Managed At­tri­butes ».

Une Python Property permet également de mettre en œuvre une forme de contrôle d’accès : l’uti­li­sa­tion de pro­prié­tés permet en effet de s’assurer qu’aucune autre méthode n’accède aux données de l’attribut pour y effectuer des mo­di­fi­ca­tions non désirées.

Conseil

Si vous utilisez Python pour réaliser un projet Web, nous vous con­seil­lons également de vous in­té­res­ser à la solution Deploy Now. Cet outil pratique vous permet de créer et de déployer votre code en passant di­rec­te­ment par GitHub, vous offrant ainsi un énorme avantage en matière d’ef­fi­ca­cité pour votre flux de travail.

La fonction Python property()

Les dé­ve­lop­peurs peuvent avoir recours à la fonction Python property() pour utiliser les pro­prié­tés. Ils peuvent tirer parti de cette fonction intégrée sans avoir à importer aucun module sup­plé­men­taire. La fonction Python property() est im­plé­men­tée dans le langage de pro­gram­ma­tion C, pour des per­for­mances optimales.

La syntaxe de la fonction Python property() se présente de la manière suivante :

property(fget=None, fset=None, fdel=None, doc=None)
Python

Les pa­ra­mètres de la fonction Python property() sont fa­cul­ta­tifs. Dans le tableau ré­ca­pi­tu­la­tif ci-dessous, vous trouverez la sig­ni­fi­ca­tion de chaque paramètre :

Paramétre Sig­ni­fi­ca­tion
fget Fonction per­met­tant de renvoyer la valeur de l’attribut (méthode getter)
fset Fonction per­met­tant de définir la valeur de l’attribut (méthode setter)
fdel Fonction indiquant la manière dont l’attribut doit être supprimé
doc Chaîne Python décrivant la propriété

Le dé­co­ra­teur Python Property

Il n’est pas né­ces­saire d’utiliser la fonction property() pour tra­vail­ler avec des pro­prié­tés. Un Python Decorator prédéfini peut souvent être utilisé ; celui-ci vous permet d’utiliser une méthode de votre classe en tant que propriété. Le langage de pro­gram­ma­tion prend en charge trois dé­co­ra­teurs dif­fé­rents avec leur notation bien connue (en « @ ») vous per­met­tant de définir une propriété :

  • « @property » : identifie une méthode de votre classe en tant que Python Property ;
  • « @property-nom.setter » : spécifie une méthode setter, qui définit la valeur d’une propriété ;
  • « @property-nom.deleter » : spécifie la méthode de sup­pres­sion d’une propriété.
Note

Si les tutoriels Python plus avancés vous in­té­res­sent, nous vous con­seil­lons également de consulter les articles suivants :

Python Property : exemple

Un exemple de code détaillé peut vous aider à prendre la mesure du fonc­tion­ne­ment et de l’utilité de la solution Python Property. Dans la section de code ci-dessous, nous com­men­çons par créer une classe nommée « Chien », avec l’attribut « _nom ». Si cet exemple est par­ti­cu­liè­re­ment ar­ti­fi­ciel et ne présente aucune utilité réelle, il est néanmoins parfait pour illustrer le fonc­tion­ne­ment de la solution Python Property.

class Chien:
	def __init__(self):
		self._nom = "Bello"
Python

Comme vous pouvez le voir, le cons­truc­teur ne reçoit aucun paramètre spé­ci­fiant le nom de notre chien. Le nom du chien est plutôt spécifié par défaut, à l’aide de la valeur « Bello ». Il est donc possible de créer un objet de la classe avec, par exemple, la ligne de code suivante :

chien = Chien()
Python

Méthodes getter et setter

Vous pouvez améliorer votre classe à l’aide de méthodes getter et setter spé­ci­fiques. Cela peut s’avérer judicieux pour plusieurs raisons, notamment parce qu’elles rendent le code plus facile à en­tre­te­nir et parce qu’elles per­met­tent l’in­té­gra­tion de fonc­tion­na­li­tés sup­plé­men­taires. Étant donné que les noms cons­ti­tuent, par défaut, des chaînes de ca­rac­tères, nous tenons également à nous assurer qu’un nom sous la forme d’une chaîne de ca­rac­tères est bien transmis dans notre classe. Pour ce faire, nous sai­sis­sons la logique fonc­tion­nelle cor­res­pon­dante dans une méthode setter dédiée pour améliorer la pré­cé­dente dé­fi­ni­tion de notre classe :

class Chien:
	def __init__(self):
		self._nom = "Bello"
	
	def getNom(self):
		return self._nom
	def setNom(self, nom):
		if isinstance(nom, str):
			self._nom = nom
		else:
			return
Python

La méthode setter portant le nom « setNom » est chargée de vérifier, dans une dé­cla­ra­tion if…else en Python, si le paramètre transmis cor­res­pond bien à une chaîne de ca­rac­tères. Cela permet, le cas échéant, de définir le nom ; sinon, il ne se passe rien.

Nous avons également choisi de spécifier une méthode getter renvoyant le nom du chien.

Un objet de notre classe appelé « Lassie » peut être créé en suivant l’exemple ci-dessous :

lassie = Chien()
lassie.setNom("Lassie")
print(lassie.getNom())
Python

Le résultat est le suivant (et cor­res­pond à ce que nous sou­hai­tions) :

'Lassie'
Note

Con­trai­re­ment à d’autres langages de pro­gram­ma­tion, Python n’offre aucune pos­si­bi­lité d’établir une dis­tinc­tion entre les attributs de classe pouvant être utilisés di­rec­te­ment depuis l’extérieur, sans aucune méthode getter ni setter (dans d’autres langages de pro­gram­ma­tion, ces attributs sont souvent ca­rac­té­ri­sés comme étant « public »), et les attributs de classe ne devant pas être fa­ci­le­ment mo­di­fiables depuis l’extérieur (dans d’autres langages de pro­gram­ma­tion, ces attributs sont plutôt ca­rac­té­ri­sés comme étant « private »). Les con­ven­tions veulent donc que les attributs des noms de variable ne devant pas être utilisés sans les méthodes getter et setter com­men­cent par un tiret bas.

Fonction Python property()

Pour éviter d’avoir à recourir à un appel de fonction explicite pour modifier ou connaître le nom de votre chien en Python, vous pouvez main­te­nant utiliser une Python Property. À des fins de dé­mons­tra­tion, nous avons également choisi d’intégrer une dé­cla­ra­tion print à chacune de nos méthodes getter et setter.

class Chien:
	def __init__(self):
		self._nom = "Bello"
	def getNom(self):
		print("Appel de la méthode getter")
		return self._nom
	def setNom(self, nom):
		if isinstance(nom, str):
			self._nom = nom
			print("Appel de la méthode setter")
		else:
			return
	
	nom = property(getNom, setNom)
Python

Comme vous pouvez le voir, il nous a suffi de créer un nouvel attribut appelé « nom » (sans placer de tiret bas au début, car la Python Property nous a permis de l’adresser depuis l’extérieur sans aucun problème) et de lui attribuer le résultat de notre appel de fonction pour appeler la fonction property(). Elle a alors reçu les deux méthodes getter et setter que vous con­nais­sez déjà en tant que pa­ra­mètres.

En créant main­te­nant un autre objet de la classe nommé « Snoopy », la dif­fé­rence est déjà visible :

snoopy = Chien()
snoopy.nom = "Snoopy"
snoopy.nom
Python

Il est désormais possible d’accéder fa­ci­le­ment aux attributs de cette classe en utilisant la notation par points qui doit déjà vous être familière. Ici, le résultat renvoyé par le programme est par­ti­cu­liè­re­ment in­té­res­sant :

Appel de la méthode setter
Appel de la méthode getter
'Snoopy'

Les méthodes getter et setter n’ont pas été appelées de manière explicite, mais elles ont tout de même été exécutées au moment de l’at­tri­bu­tion ou de l’ex­trac­tion de l’objet « Snoopy » à l’aide de la notation par points. La Python Property nous a permis de parvenir à ce résultat.

Dé­co­ra­teur Python Property

Il est possible d’obtenir le même résultat avec les dé­co­ra­teurs de fonction, dont nous avons déjà parlé. Le cas échéant, l’exemple de code se présente de la manière suivante (les deux méthodes « décorées » doivent avoir le même nom) :

class Chien:
	def __init__(self):
		self._nom = "Bello"
	@property
	def nom(self):
		print("Appel de la méthode setter")
		return self._nom
	@nom.setter
	def nom(self, nom):
		if isinstance(nom, str):
			self._nom = nom
			print("Appel de la méthode getter")
		else:
			return
Python

Il est possible de créer un nouvel objet pour cette classe et d’utiliser la notation par points pour définir et extraire l’attribut « nom » :

struppi = Chien()
struppi.nom = "Struppi"
struppi.nom
Python

Le résultat est le même que celui obtenu en utilisant la fonction Python-property() :

Appel de la méthode setter
Appel de la méthode getter
'Struppi'
Aller au menu principal