Опишу кратко суть, наверно проще будет на примере. Вспомните - если забыли, либо узнаете новое для себя.
Например у нас есть класс 👇 с защищенной переменной.
class Person:
def __init__(self, name, old):
self.__name = name
self.__old = old
И чтобы с ней работать вне этого класса, как вы помните, необходимо создать доп. методы в классе. Например:
def get_old(self):
return self.__old
def set_old(self, old):
self.__old = old
property - упрощает создание сеттеров и геттеров(чтобы не писать/запоминать 100500 различных методов)
Один из вариантов создания такой:
old = property(get_old, set_old) .
Где get_old, set_old - соотествтенно гетер и сетер.
Как видим из синтаксиса - это декоратор, можно записать как выше, но лучше и практичней делать вот так вот:
class Person:
def __init__(self, name, old):
self.__name = name
self.__old = old
@property
def old(self):
return self.__old
@old.setter
def old(self, old):
self.__old = old
@old.deleter
def old(self):
del self.__old
То, что мы сделали, эквивалентно предыдущему варианту с тем лишь отличием, что теперь напрямую вызывать сеттер или геттер для локального свойства __old не получится. У нас остался один интерфейс взаимодействия – объект-свойство old. Именно так чаще всего делают на практике.
Так же есть еще один интересный момент в этом👇 Но не буду захламлять этим голову) Особо познавательным - скрытый текст в самом низу.
Ставьте реакции, спрашивайте в комментах, чтобы понять нравится, интересно, полезно или же нет😑:
знал это → 😎
узнал новое → 🤔
полезно → ❤️
есть вопросы → пишите
Та самая муть - можно не читать:
p = Person('ВАся', 25)
p.old = 35
p.__dict__['old'] = 45
print(p.__dict__)
print(p.old) # - что тут выведется, как думаете? кто знает?)
Например, можем создавать локальное свойство old в экземпляре класса, но при выводе и взаимодействии с ним будет использоваться то, что в защищенной переменной. Хотя, казалось бы, по логике должно же меняться локальное свойство old.
И ТАКОЕ СВОЙСВТВО БЕРЕТСЯ ВПЕРЕД( В ПРИОРИТЕТЕ НАД ДАЖЕ НАД СВОЙСТВОМ ЭКЗЕМПЛЯРА КЛАССА)