На этом шаге мы рассмотрим способы получения доступа к свойствам класса.
Внутри класса можно создать идентификатор, через который в дальнейшем будут производиться операции получения и изменения значения какого-либо атрибута, а также его удаления. Создается такой идентификатор с помощью функции 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
На следующем шаге мы рассмотрим декораторы класса.