Fonction Python property()
Fonctions intégrées de Python3
property()C'est une fonction intégrée de Python utilisée pour créer des propriétés.
property est un mécanisme puissant qui nous permet d'exécuter du code lors de l'accès aux attributs. Il est souvent utilisé pour implémenter des fonctionnalités avancées telles que les propriétés calculées et la validation des données.
Définitions de mots: property 意为"属性",用于定义类的属性。
Syntaxe de base et paramètres
Format de syntaxe
property(fget=None, fset=None, fdel=None, doc=None)
Description du paramètre
- Paramètre fget(Facultatif) :
- Type : Fonction
- Description : la fonction appelée lors de la lecture de la valeur de la propriété.
- Paramètre fset(Facultatif) :
- Type : Fonction
- Description : la fonction appelée lors de la définition de la valeur de la propriété.
- Paramètre fdel(Facultatif) :
- Type : Fonction
- Description : la fonction appelée lors de la suppression de la propriété.
- Paramètre doc(Facultatif) :
- Type : String
- Description : la docstring de la propriété.
Description de la fonction
- Valeur de retour: renvoie un objet property.
- Fonctionnalités: fait en sorte que l'accès à une propriété ressemble à celui d'une variable normale, mais exécute en réalité une fonction.
Exemples
Exemple 1 : Utilisation de base
Exemple
class Circle:
def __init__(self, radius):
self.radius = radius
# Utilisation de property pour créer des propriétés calculées
def get_area(self):
"""Calcule l'aire d'un cercle."""
return 3.14159 * self.radius ** 2
def set_radius(self, value):
"""Définit le rayon (une validation peut être ajoutée)."""
if value < 0:
raise ValueError(Le rayon ne peut pas être négatif)
self.radius = value
# Créer une propriété
area = property(get_area, set_radius)
# Utilisation
c = Circle(5)
print(fRayon : {c.radius}) # Sortie : Rayon : 5
print(fAire : {c.area}) # Sortie : Aire : 78.53975
# Définir une propriété
c.radius = 10
print(fNouvelle aire : {c.area}) # Sortie : Nouvelle aire : 314.159
# Vérifier
c.radius = -5 # Lèvera une exception
def __init__(self, radius):
self.radius = radius
# Utilisation de property pour créer des propriétés calculées
def get_area(self):
"""Calcule l'aire d'un cercle."""
return 3.14159 * self.radius ** 2
def set_radius(self, value):
"""Définit le rayon (une validation peut être ajoutée)."""
if value < 0:
raise ValueError(Le rayon ne peut pas être négatif)
self.radius = value
# Créer une propriété
area = property(get_area, set_radius)
# Utilisation
c = Circle(5)
print(fRayon : {c.radius}) # Sortie : Rayon : 5
print(fAire : {c.area}) # Sortie : Aire : 78.53975
# Définir une propriété
c.radius = 10
print(fNouvelle aire : {c.area}) # Sortie : Nouvelle aire : 314.159
# Vérifier
c.radius = -5 # Lèvera une exception
Sortie attendue :
半径: 5 面积: 78.53975 新面积: 314.159
Explication du code :
- Avec property, vous pouvez définir des propriétés calculées.
- Le setter peut ajouter une logique de validation des données.
Exemple 2 : Utilisation du décorateur @property (recommandé)
Exemple
class Student:
def __init__(self, name, score):
self.name = name
self._score = score
@property
def score(self):
"""Obtenir le score"""
return self._score
@score.setter
def score(self, value):
"""Définir le score (avec validation)"""
if not 0 <= value <= 100:
raise ValueError(Le score doit être compris entre 0 et 100)
self._score = value
@property
def grade(self):
"""Calculer la note en fonction du score"""
if self._score >= 90:
return 'A'
elif self._score >= 80:
return 'B'
elif self._score >= 70:
return 'C'
elif self._score >= 60:
return 'D'
else:
return 'F'
# Utilisation
s = Student("Tom", 85)
print(s.name) # Sortie: Tom
print(s.score) # Sortie : 85
print(s.grade) # Sortie : B
s.score = 92 # Définir le score
print(s.grade) # Sortie : A
s.score = 105 # Va lever une exception
def __init__(self, name, score):
self.name = name
self._score = score
@property
def score(self):
"""Obtenir le score"""
return self._score
@score.setter
def score(self, value):
"""Définir le score (avec validation)"""
if not 0 <= value <= 100:
raise ValueError(Le score doit être compris entre 0 et 100)
self._score = value
@property
def grade(self):
"""Calculer la note en fonction du score"""
if self._score >= 90:
return 'A'
elif self._score >= 80:
return 'B'
elif self._score >= 70:
return 'C'
elif self._score >= 60:
return 'D'
else:
return 'F'
# Utilisation
s = Student("Tom", 85)
print(s.name) # Sortie: Tom
print(s.score) # Sortie : 85
print(s.grade) # Sortie : B
s.score = 92 # Définir le score
print(s.grade) # Sortie : A
s.score = 105 # Va lever une exception
Sortie attendue :
Tom 85 B A
Explication du code :
- Le décorateur @property est une façon plus pythonique de l'écrire.
- Vous pouvez définir getter, setter et deleter.
Exemple 3 : Propriété en lecture seule
Exemple
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
"""Propriété en lecture seule"""
return self._name
# Sans setter, la propriété ne peut pas être modifiée
p = Person("Tom")
print(p.name) # Sortie: Tom
# Tenter de la modifier lèvera une erreur (pas de setter)
# p.name = "Jack" # lèvera AttributeError
# Sa suppression lèvera également une erreur
# del p.name # lèvera AttributeError
def __init__(self, name):
self._name = name
@property
def name(self):
"""Propriété en lecture seule"""
return self._name
# Sans setter, la propriété ne peut pas être modifiée
p = Person("Tom")
print(p.name) # Sortie: Tom
# Tenter de la modifier lèvera une erreur (pas de setter)
# p.name = "Jack" # lèvera AttributeError
# Sa suppression lèvera également une erreur
# del p.name # lèvera AttributeError
Sortie attendue :
Tom
En définissant uniquement un getter et aucun setter, vous pouvez créer une propriété en lecture seule.
Fonctions intégrées de Python3
Autres extensions