@property
Основная идея - создания буферных зон.
Чтобы скрыть от пользователя то, что должно быть скрыто. Либо для того чтобы создать интерфейс взаимодействия - его можно будет с легкостью видоизменять в дальнейшем.
class Person:
def __init__(self, name):
self._name = name
def get_name(self):
print("From get_name: ")
return self._name
def set_name(self, name):
print("From set_name: ")
self._name = name
name = property(fget=get_name, fset=set_name)
# вариант 2
# name = property()
# name.setter(set_name)
# name.getter(get_name)
# вариант 3
# name = property(get_name)
# name.setter(set_name)
p = Person("Dima")
# p.__dict__
# {'name': 'Dima'}
p.name
# From get_name:
# 'Dima'
p.name = "Ivan"
# From set_name:
# 'Ivan'
1234567891011121314151617181920212223242526272829303132333435
При использовании декоратора получится следующее
...
@property # работает как name = property(name)
def name(self):
return self._name
# теперь укажем сеттер
@name.setter # работает как name = name.setter(set_name)
def name(self, value): # при использовании декоратора функцию переименовываем
self._name = value # в name, как у @property
# Если имя функции у сеттера будет другим, а не таким же как у геттера (с @property), то получим исключение
1234567891011
[!info] Для чего можно использовать @property
методы класса со свойством только для чтения
метод класса для вычисляемых свойств (например, для конкатенации свойств класса и его вывода)
Самое простое - это создать функцию с декоратором @property
но только геттер (без сеттера не будет возможности записи значения).
Пример вычисляемого свойства:
class Person:
def __init__(self, name, lastname):
self._name = name
self._lastname = lastname
# вычисляемое свойство
@property
def full_name(self):
return f"{self._name} {self._lastname}""
12345678910
Вычисляемые свойства имеет смысл использовать тогда, когда нет смысла хранить состояния (они будут считаться каждый раз при вызове)
Last updated
Was this helpful?