Шаг 145.
Основы языка Python.
Объектно-ориентированное программирование (ООП). Свойства класса

    На этом шаге мы рассмотрим способы получения доступа к свойствам класса.

    Внутри класса можно создать идентификатор, через который в дальнейшем будут производиться операции получения и изменения значения какого-либо атрибута, а также его удаления. Создается такой идентификатор с помощью функции property(). Формат функции:

  <Свойство> = property(<Чтение>[, <Запись>[, <Удаление>
        [, <Строка документирования>]])

    В первых трех параметрах указывается ссылка на соответствующий метод класса. При попытке получить значение будет вызван метод, указанный в первом параметре. При операции присваивания значения будет вызван метод, указанный во втором параметре, - этот метод должен принимать один параметр. В случае удаления атрибута вызывается метод, указанный в третьем параметре. Если в качестве какого-либо параметра задано значение None, то это означает, что соответствующий метод не поддерживается. Рассмотрим свойства класса на примере:

class MyClass:
    def __init__ (self, value):
        self.__var = value
    def get_var(self):        # Чтение
        return self.__var
    def set_var(self, value): # Запись
        self.__var = value
    def del_var(self):        # Удаление
        del self.__var
    v = property(get_var, set_var, del_var, "Строка документирования")

c = MyClass(5)
c.v = 35	# Вызывается метод set_var()
print(c.v)	# Вызывается метод get_var()
del c.v	        # Вызывается метод del_var()
Архив с файлом можно взять здесь.

    Результат работы приложения:

35

    Python поддерживает альтернативный метод определения свойств - с помощью методов property(), setter() и deleter(), которые используются в декораторах. Пример их использования приведен ниже:

class MyClass:
    def __init__ (self, value):
        self.__var = value
    @property
    def v(self):        # Чтение
        return self.__var
    @v.setter
    def v(self, value): # Запись
        self.__var = value
    @v.deleter
    def v(self):        # Удаление
        del self.__var

c = MyClass(5)
c.v = 35	# Чтение
print(c.v)	# Запись
del c.v	        # Удаление
Архив с файлом можно взять здесь.

    Результат работы приложения:

35

    Имеется возможность определить абстрактное свойство - в этом случае все реализующие его методы должны быть переопределены в подклассе. Выполняется это с помощью знакомого нам декоратора @abstractmethod из модуля abc. Пример определения абстрактного свойства показан ниже:

from abc import ABCMeta, abstractmethod
class MyClass1 (metaclass=ABCMeta):
    def __init__ (self, value):
        self.__var = value
    @property
    @abstractmethod
    def v(self):        # Чтение
        return self.__var
    @v.setter
    @abstractmethod
    def v(self, value): # Запись
        self.__var = value
    @v.deleter
    @abstractmethod
    def v(self):        # Удаление
        del self.__var
Архив с файлом можно взять здесь.


   Примечание. В версиях Python, предшествующих 3.3, для определения абстрактного свойства применялся декоратор @abstractproperty, определенный в модуле abc. Однако, начиная с Python 3.3, этот декоратор объявлен нерекомендованным к использованию.

    На следующем шаге мы рассмотрим декораторы класса.




Предыдущий шаг Содержание Следующий шаг