12. Аттрибуты объектов.

Работа с аттрибутами объектов

Переопределение доступа к полям по имени

Определение property полей

Декоратор property позволяет определять виртуальные поля, задавая (или нет) отдельные методы в качестве геттера, сеттера, удаляющего, а также определить документацию.

class PseudoMeter(object):
    def __init__(self):
        self.__temperature = 0

    def __get_temperature(self):
        print "Asked for temperature"
        return self.__temperature

    def __set_temperature(self, value):
        print "Got new value"
        if not isinstance(value, int):
            raise TypeError("int value required")
        self.__temperature = value

    temperature = property(__get_temperature, __set_temperature)

meter = PseudoMeter()
meter.temperature = 10
print meter.temperature
Got new value
Asked for temperature
10

Это был простейший пример. Можно делать аккуратнее и, зависимости от конкретного случая, использовать данный декоратор различными способами.

class PseudoMeter(object):
    def __init__(self):
        self.__temperature = 0

    @property
    def temperature(self):
        print "Asked for temperature"
        return self.__temperature

meter = PseudoMeter()
print meter.temperature
Asked for temperature
0

Или так:

class PseudoMeter(object):
    def __init__(self):
        self.__temperature = 0

    @property
    def temperature(self):
        print "Asked for temperature"
        return self.__temperature

    @temperature.setter
    def temperature(self, value):
        print "Got new value"
        if not isinstance(value, int):
            raise TypeError("int value required")
        self.__temperature = value

meter = PseudoMeter()
meter.temperature = 10
print meter.temperature
Got new value
Asked for temperature
10