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

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

21.05.2023, 19:26. Показов 1005. Ответов 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
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru