TI/Property
Z Brain-wiki
Wbudowana funkcja property zwraca specjalny obiekt, który może być użyty jako atrybut. Przy dostepie do tego atrybutu interpreter zachowuje się w szczególny sposób. Przy odczycie atrybutu nie zwraca obiektu, który jest przypisany pod nazwą atrybutu, lecz wywołuje na nim metodę. Podobnie przy przypisaniu do atrybutu, nie podstawia przypisywanej wartości jako nowej wartości atrybutu tylko wywołuje metodę.
Tak, jak na przykładzie:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Parrot(object):
def __init__(self):
self._voltage = 100000
@property
def voltage(self):
"""Get the current voltage."""
return self._voltage
pa = Parrot()
print pa.voltage
Dekoracja za pomocą property, powoduje, że metoda voltage staje się getterem (czyli zwraca atrybut) dla atrybutu prywatego o tej samej nazwie.
Co dzieje się, gdy chcemy mieć getter i setter (ustalenie wartości atrybutu)?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Parrot(object):
def __init__(self):
self._voltage = 100000
def _get_voltage(self):
"""Get the current voltage."""
return self._voltage
def _set_v(self, new_voltage):
self._voltage = 2 * new_voltage
voltage = property(_get_voltage, _set_v)
pa = Parrot()
print pa.voltage
pa.voltage = 1000
print pa.voltage
Nie możemy mieć dwóch funkcji o tej samej nazwie, dekorujemy zatem obie funkcje na raz:
voltage = property(_get_voltage, _set_v)