👍1👎1
«Из−за того, что декораторы классов способны перехватывать вызовы, создающие экземпляры, они могут использоваться либо для управления созданием экземпляров классов, либо для реализации паттерна проектирования «одиночка». В последнем случае декоратор обеспечивает, чтобы экземпляр класса существовал в единственном числе, и при последующих вызовах возвращался именно он.»
Декоратор 𝚂𝚒𝚗𝚐𝚕𝚎𝚝𝚘𝚗 работает следующим образом:
− В словаре 𝚒𝚗𝚜𝚝𝚊𝚗𝚌𝚎𝚜 хранятся созданные экземпляры для каждого класса;
− При первом вызове 𝙿𝚎𝚛𝚜𝚘𝚗('𝙱𝚘𝚋') создается экземпляр и сохраняется в словаре;
− При втором вызове 𝙿𝚎𝚛𝚜𝚘𝚗('𝚂𝚞𝚎') декоратор проверяет, что экземпляр уже существует, и возвращает тот же объект;
− Поэтому и 𝚋𝚘𝚋, и 𝚜𝚞𝚎 ссылаются на один и тот же объект с именем '𝙱𝚘𝚋'.
Таким образом, при выводе 𝚋𝚘𝚋.𝚗𝚊𝚖𝚎 и 𝚜𝚞𝚎.𝚗𝚊𝚖𝚎 мы получаем '𝙱𝚘𝚋' дважды, поскольку это один и тот же объект.
👍1👎1
❤1👍1👎1
«В этом коде класс 𝚆𝚛𝚊𝚙𝚙𝚎𝚛 перехватывает доступ к любым именованным атрибутам внутреннего объекта, выводит трассировочное сообщение и применяет встроенную функцию __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ для передачи запроса 𝚠𝚛𝚊𝚙𝚙𝚎𝚍−объекту.»
Механизм работы:
− При создании экземпляра 𝚆𝚛𝚊𝚙𝚙𝚎𝚛([𝟷, 𝟸, 𝟹]) сохраняется список в атрибуте 𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍
− При вызове 𝚡.𝚊𝚙𝚙𝚎𝚗𝚍(𝟺) 𝙿𝚢𝚝𝚑𝚘𝚗 не находит метод 𝚊𝚙𝚙𝚎𝚗𝚍 у класса 𝚆𝚛𝚊𝚙𝚙𝚎𝚛
− Срабатывает метод __𝚐𝚎𝚝𝚊𝚝𝚝𝚛__ с параметром 𝚊𝚝𝚝𝚛𝚗𝚊𝚖𝚎 = '𝚊𝚙𝚙𝚎𝚗𝚍'
− Выводится сообщение «𝚃𝚛𝚊𝚌𝚎: 𝚊𝚙𝚙𝚎𝚗𝚍»
− Функция 𝚐𝚎𝚝𝚊𝚝𝚝𝚛(𝚜𝚎𝚕𝚏.𝚠𝚛𝚊𝚙𝚙𝚎𝚍, 𝚊𝚝𝚝𝚛𝚗𝚊𝚖𝚎) находит метод 𝚊𝚙𝚙𝚎𝚗𝚍 у обернутого списка и вызывает его
− Список [𝟷, 𝟸, 𝟹] становится [𝟷, 𝟸, 𝟹, 𝟺]
− При выводе 𝚡.𝚠𝚛𝚊𝚙𝚙𝚎𝚍 выводится содержимое обернутого списка: [𝟷, 𝟸, 𝟹, 𝟺]
«В частности, он отслеживает доступ к атрибутам, осуществляемый вызовом метода класса 𝚠𝚛𝚊𝚙𝚙𝚎𝚍−объекта; доступ к другим методам внутреннего объекта не перехватывается и не подлежит обработке по определению».
👍1👎1
Всем тимлидам, разработчикам, тестировщикам и админам!
Счастливого Дня программиста!
Желаем вам всегда зелёных билдов, отзывчивых кластеров и тихих дежурных смен. Пусть ваши логи будут чисты от ошибок, а мониторинг предупреждает о проблемах раньше, чем о них узнают пользователи.
И чтобы пожелание точно сбылось, обязательно воспользуйтесь подарками из нашей IT-коробки. Готовили с любовью в сердце вместе с нашими друзьями.
С праздником!
Счастливого Дня программиста!
Желаем вам всегда зелёных билдов, отзывчивых кластеров и тихих дежурных смен. Пусть ваши логи будут чисты от ошибок, а мониторинг предупреждает о проблемах раньше, чем о них узнают пользователи.
И чтобы пожелание точно сбылось, обязательно воспользуйтесь подарками из нашей IT-коробки. Готовили с любовью в сердце вместе с нашими друзьями.
С праздником!
👎1
Марк Лутц «Изучаем Python», глава 39:
«Однако, как теоретически обсуждалось ранее, такая альтернатива, где используются только классы, подвержена множеству классов, но не вполне нормально работает с множеством экземпляров заданного класса: каждый вызов, создающий экземпляр, запускает метод __𝚌𝚊𝚕𝚕__, который перезаписывает предыдущий экземпляр».
Механизм работы:
При обращении к 𝚋𝚘𝚋.𝚗𝚊𝚖𝚎 и 𝚜𝚞𝚎.𝚗𝚊𝚖𝚎:
В данном случае каждый вызов 𝙿𝚎𝚛𝚜𝚘𝚗() создает новый объект 𝚃𝚛𝚊𝚌𝚎𝚛, поэтому проблема с перезаписью экземпляров не проявляется.
Please open Telegram to view this post
VIEW IN TELEGRAM
А может ну это всё и улететь работать в космос?
На станцию Контур активно ищут новобранцев. Берут тех, кто разбирается в программировании, тестировании, UX-исследованиях и аналитике.
Запускайте бота и проходите миссии. В конце — розыгрыш целого бокса с космическим мерчем!
🚀Стажировка уже началась. Вперёд!
На станцию Контур активно ищут новобранцев. Берут тех, кто разбирается в программировании, тестировании, UX-исследованиях и аналитике.
Запускайте бота и проходите миссии. В конце — розыгрыш целого бокса с космическим мерчем!
🚀Стажировка уже началась. Вперёд!
Предположим, что вы требуете от методов или классов, используемых приложением, регистрации в API−интерфейсе для будущей обработки (может быть, API−интерфейс позже будет обращаться к объектам и отвечать на текущие события). Несмотря на то что это могли бы предоставить регистрационные функции, которые выполняли вызову вручную после того, как объекты определены, декораторы сделают ваше решение более элегантным.
Механизм работы:
Поскольку он возвращает сам объект, а не оболочку, он не перехватывает будущие вызовы.
Вывод кода:
Таким образом, регистр хранит ссылки на функции и классы, и их можно вызывать напрямую через регистр.
Please open Telegram to view this post
VIEW IN TELEGRAM