Ton tuto a pas l'air correct. Je te conseil de vérifier dans la doc pour ce genre de cas:
https://docs.python.org/3.8/library/functions.html?highlight=property#property
En gros le constructeur de property est class property(fget=None, fset=None, fdel=None, doc=None) et toi tu précises juste le premier argument, c'est à dire le getter.
Plus exactement, tu fais ça:
age = property(_setage)
Du coup le code considère ta méthode _setage comme un getter (et les getters sont en READ ONLY), d'où l'erreur lors d'une tentative d'assignement.
Et du coup, pour avoir ce que tu veux, faudrait faire:
class Humain:
def __init__(self, nom, age):
print("Creation d'un humain: ")
self._nom = nom
self._age = age
def _getnom(self):
print("Impossible d'indiquer le nom")
def _getage(self):
return self._age
def _setage(self, nouvel_age):
if nouvel_age < 0:
self._age = 0
else:
self._age = nouvel_age
nom = property(_getnom)
# Le Underscore indique que la fonction n'est valable que dans la classe
age = property(_getage, _setage)
Ou avec les décorateurs (je préfère cette version perso):
class Humain:
def __init__(self, nom, age):
print("Creation d'un humain: ")
self._nom = nom
self._age = age
@property
def nom(self):
print("Impossible d'indiquer le nom")
@property
def age(self):
return self._age
@age.setter
def age(self, nouvel_age):
if nouvel_age < 0:
self._age = 0
else:
self._age = nouvel_age
Message édité le 21 décembre 2019 à 13:27:34 par [Black_Spirit]