
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)

