> For the complete documentation index, see [llms.txt](https://igor-19.gitbook.io/qa/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://igor-19.gitbook.io/qa/avtomatizaciya-testirovaniya/python/oop-v-python-vo-vsekh-podrobnostyakh/property.md).

# @property

Основная идея - *создания буферных зон*.

Чтобы скрыть от пользователя то, что должно быть скрыто. Либо для того чтобы создать интерфейс взаимодействия - его можно будет с  легкостью видоизменять в дальнейшем.

```python
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
```

При использовании декоратора получится следующее

```python
...
@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` но *только геттер* (без сеттера не будет возможности записи значения).

Пример *вычисляемого свойства*:

```python
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
```

*Вычисляемые свойства* имеет смысл использовать тогда, когда нет смысла хранить состояния (они будут считаться каждый раз при вызове)
