Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 18.04.2022
Сообщений: 10

Декоратор @property ООП прошу объяснить как это работает

21.05.2023, 19:26. Показов 942. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Изучив основы python, я начал знакомиться с ООП, и на моём пути встала тема с декоратором @property. Как объясняют в видео и на сайтах, что это объект свойств и у него есть свои методы (get, set, del ...) которые тоже работают как декор и то, что он предназначен для превращение методов в параметры экземпляра. Но я никак не могу понять, если декоратор это ФУНКЦИЯ, которая принимает в себя другую функцию, то в консоле при вводе property() - пишет, что это объект, а не функция! Получается когда пишут @property - это по сути объект, который принимает 1 аргумент функцию (Что он потом возвращает - функцию или объект?)? Если это так, то почему в таком варианте property(set, get) может принимать 2 и более агрументов?

ещё вот такой кусок когда меня вводит в ступор
Python
1
2
3
old = property()
old = old.setter(set_old)
old = old.getter(get_old)
В первой строке это объект, но почему в след строках нет переприсваивания переменной old?
Облазил все сайты, но нигде не нашёл объяснение работы этого декоратора под капотом.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2023, 19:26
Ответы с готовыми решениями:

Прошу объяснить, как оно работает
Всем доброго времени суток. Пишу курсач, сдавать через три дня, надо в пояснительной записке описать как что работает. Задание,с которым не...

Можете объяснить как это работает
Я понимаю, что это динамическое выделение памяти для двумерного массива, но не понимаю, для чего пишется int * в функции sizeof,а в цикле...

Прошу объяснить как работает сортировка в плане привязки полей имени и оценок к конкретной группе
Это программа из задания про структуру и отдельные функции. Пользователь вводит имя, группу и оценки стольких студентов, сколько нужно....

5
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
22.05.2023, 11:05
Paratrooper18, Я не знаю как ответить именно на поставленный вопрос. Могу описать только варианты использования.

Вариант с использованием функции property(). В коде использованы только два аргумента (getter и setter), но она может принимать до четырех. Третий будет deleter а четвертый doc-string.

Вроде как данная функция возвращает объект внутреннего класса property. Но это не точно =)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo:
    def __init__(self):
        self._data = None
        
    def _get_data(self):
        return self._data
        
    def _set_data(self, value):
        self._data = value
        
    data = property(_get_data, _set_data)
    
    
f = Foo()
f.data = 5
print(f.data)
И вариант с декоратором @property.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo:
    def __init__(self):
        self._data = None
    
    @property    
    def data(self):
        return self._data
        
    @data.setter    
    def data(self, value):
        self._data = value
 
        
f = Foo()
f.data = 5
print(f.data)
0
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
22.05.2023, 13:26
Цитата Сообщение от Paratrooper18 Посмотреть сообщение
если декоратор это ФУНКЦИЯ, которая принимает в себя другую функцию
Это не верно, класс тоже может быть как декоратором, так и декорируемым объектом. https://tirinox.ru/class-decorator/
Цитата Сообщение от Paratrooper18 Посмотреть сообщение
@property - это по сути объект, который принимает 1 аргумент функцию (Что он потом возвращает - функцию или объект?)? Если это так, то почему в таком варианте property(set, get) может принимать 2 и более агрументов?
property принимает до 4 аргументов
Python
1
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
Цитата Сообщение от Paratrooper18 Посмотреть сообщение
В первой строке это объект, но почему в след строках нет переприсваивания переменной old?
Откуда уверенность, что нет переприсваивания?
Python
1
2
3
4
5
6
7
8
9
    old = property()
    print(id(old))
    print(type(old))
    old = old.setter(set_old)
    print(id(old))
    print(type(old))
    old = old.getter(get_old)
    print(id(old))
    print(type(old))
тут видно, что получаем новый объект property/
2
0 / 0 / 0
Регистрация: 18.04.2022
Сообщений: 10
22.05.2023, 15:26  [ТС]
Всё-таки @property - это объект? Мне как новичку очень тяжело осознать это, ведь раньше для меня декоратор мог быть только функцией. Было проще, если бы можно было посмотреть код класса property и как создаётся этот объект. PS. Я уже знаю, что это реализовано на C++, но хочу увидеть аналог в python стиле
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
22.05.2023, 15:34
Paratrooper18, функция тоже объект и даже модуль который ты импортируешь, в питоне все является объектом
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
22.05.2023, 16:36
Лучший ответ Сообщение было отмечено Paratrooper18 как решение

Решение

Цитата Сообщение от Paratrooper18 Посмотреть сообщение
Было проще, если бы можно было посмотреть код класса property и как создаётся этот объект.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class property:
    fget: Callable[[Any], Any] | None
    fset: Callable[[Any, Any], None] | None
    fdel: Callable[[Any], None] | None
    __isabstractmethod__: bool
    def __init__(
        self,
        fget: Callable[[Any], Any] | None = ...,
        fset: Callable[[Any, Any], None] | None = ...,
        fdel: Callable[[Any], None] | None = ...,
        doc: str | None = ...,
    ) -> None: ...
    def getter(self, __fget: Callable[[Any], Any]) -> property: ...
    def setter(self, __fset: Callable[[Any, Any], None]) -> property: ...
    def deleter(self, __fdel: Callable[[Any], None]) -> property: ...
    def __get__(self, __obj: Any, __type: type | None = ...) -> Any: ...
    def __set__(self, __obj: Any, __value: Any) -> None: ...
    def __delete__(self, __obj: Any) -> None: ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.05.2023, 16:36
Помогаю со студенческими работами здесь

Кто-нибудь может объяснить как это работает?
Именно создание списка не понятно main :: IO() main = do let fib = 0 : 1 : n <- readLn print(fib !! n)

Объясните пожалуйста как работает этот код, как это объяснить преподавателю, кто шарит
Тут вначале понятно, тип матрица 5 на 5, дальше что за переменные? и что за условие в цикле выполняется не совсем понимаю, объяните плиз ...

Подробно раскрыть метод sort и объяснить как он работает + объяснить его рекурсию
Подробно раскрыть метод sort (и как его вообще раскрыть) и объяснить как он работает + объяснить его рекурсию

Прошу объяснить о ссылках,указателях,стрелке -> и двоеточиях :: очень прошу я не понял синтаксис
Здравствуйте! Есть конкретно 4 типа: 1)стрелка (->) 2)указатели (*) 3)ссылки (&) 4)2е двоеточий (::) а вопрос:что они собой...

Прошу доделать или объяснить почему не работает код с "Жизнью"
Вечер добрый. Учу в универе с++, задали написать игру Жизнь так, чтобы начальная конфигурация задавалась пользователем. выучились совсем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru