Python Language
Objets de propriété
Recherche…
Remarques
Remarque : dans Python 2, assurez-vous que votre classe hérite de l'objet (ce qui en fait une classe de style nouveau) afin que toutes les fonctionnalités des propriétés soient disponibles.
Utiliser le décorateur @property
Le décorateur @property
peut être utilisé pour définir des méthodes dans une classe qui agissent comme des attributs. Un exemple où cela peut être utile est lorsque vous exposez des informations qui peuvent nécessiter une recherche initiale (coûteuse) et une récupération simple par la suite.
Étant donné un module foobar.py
:
class Foo(object): def __init__(self): self.__bar = None @property def bar(self): if self.__bar is None: self.__bar = some_expensive_lookup_operation() return self.__bar
alors
>>> from foobar import Foo >>> foo = Foo() >>> print(foo.bar) # This will take some time since bar is None after initialization 42 >>> print(foo.bar) # This is much faster since bar has a value now 42
Utilisation du décorateur @property pour les propriétés en lecture-écriture
Si vous souhaitez utiliser @property
pour implémenter un comportement personnalisé pour définir et obtenir, utilisez ce modèle:
class Cash(object):
def __init__(self, value):
self.value = value
@property
def formatted(self):
return '${:.2f}'.format(self.value)
@formatted.setter
def formatted(self, new):
self.value = float(new[1:])
Pour utiliser ceci:
>>> wallet = Cash(2.50)
>>> print(wallet.formatted)
$2.50
>>> print(wallet.value)
2.5
>>> wallet.formatted = '$123.45'
>>> print(wallet.formatted)
$123.45
>>> print(wallet.value)
123.45
Ne substituer qu'un getter, un setter ou un deleter d'un objet de propriété
Lorsque vous héritez d'une classe avec une propriété, vous pouvez fournir une nouvelle implémentation pour une ou plusieurs des fonctions getter
, setter
ou deleter
, en référençant l'objet propriété sur la classe parent :
class BaseClass(object):
@property
def foo(self):
return some_calculated_value()
@foo.setter
def foo(self, value):
do_something_with_value(value)
class DerivedClass(BaseClass):
@BaseClass.foo.setter
def foo(self, value):
do_something_different_with_value(value)
Vous pouvez également ajouter un setter ou un deleter là où il n'y en avait pas auparavant sur la classe de base.
Utiliser des propriétés sans décorateurs
Bien que l'utilisation de la syntaxe de décorateur (avec le @) soit pratique, elle cache aussi un peu. Vous pouvez utiliser des propriétés directement, sans décorateurs. L'exemple suivant de Python 3.x montre ceci:
class A:
p = 1234
def getX (self):
return self._x
def setX (self, value):
self._x = value
def getY (self):
return self._y
def setY (self, value):
self._y = 1000 + value # Weird but possible
def getY2 (self):
return self._y
def setY2 (self, value):
self._y = value
def getT (self):
return self._t
def setT (self, value):
self._t = value
def getU (self):
return self._u + 10000
def setU (self, value):
self._u = value - 5000
x, y, y2 = property (getX, setX), property (getY, setY), property (getY2, setY2)
t = property (getT, setT)
u = property (getU, setU)
A.q = 5678
class B:
def getZ (self):
return self.z_
def setZ (self, value):
self.z_ = value
z = property (getZ, setZ)
class C:
def __init__ (self):
self.offset = 1234
def getW (self):
return self.w_ + self.offset
def setW (self, value):
self.w_ = value - self.offset
w = property (getW, setW)
a1 = A ()
a2 = A ()
a1.y2 = 1000
a2.y2 = 2000
a1.x = 5
a1.y = 6
a2.x = 7
a2.y = 8
a1.t = 77
a1.u = 88
print (a1.x, a1.y, a1.y2)
print (a2.x, a2.y, a2.y2)
print (a1.p, a2.p, a1.q, a2.q)
print (a1.t, a1.u)
b = B ()
c = C ()
b.z = 100100
c.z = 200200
c.w = 300300
print (a1.x, b.z, c.z, c.w)
c.w = 400400
c.z = 500500
b.z = 600600
print (a1.x, b.z, c.z, c.w)