TI/Property

Z Brain-wiki
Wersja z dnia 10:20, 23 maj 2015 autorstwa Jarekz (dyskusja | edycje) (Utworzono nową stronę "Wbudowana funkcja <tt>property</tt> zwraca specjalny obiekt, który może być użyty jako atrybut. Przy dostepie do tego atrybutu interpreter zachowuje się w szczegól...")
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

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)