@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