Дополнительно
Как @недвижимость работе декоратора?
Я хотел бы понять, как встроенный работает функция "имущество". Что меня смущает, что "имущество" также может быть использован в качестве декоратора, но он только принимает доводы при использовании в качестве встроенной функции, а не при использовании в качестве декоратора.
Это пример из документации:
class C(object):
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
собственность
'ы аргументы getx
, setx
, delxбыл
и док строку.
В коде ниже "имущество" используется в качестве оформителя. Объектом его является функция х
, но в коде выше нет места для функции объекта в аргументах.
class C(object):
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
И, как на X.сеттери
X.декораторы делетер создали?
Я запутался.
884
13
Свойства (функции)` возвращает специальный объект дескриптора:
Это объект, который имеет дополнительные методы:
Это выступать в качестве декораторов слишком. Они возвращают новый объект недвижимости:
это копия старого объекта, но с одной из функций, заменить.
Помните, что
@оформитель
синтаксис-это просто синтаксический сахар; синтаксис:на самом деле означает то же самое, что
так что
фу
функция заменяется имущества(фу), которые мы видели выше, является особым объектом. Затем, когда вы используете@фу.метод set()
, что вы делаете, называете этосвойство().сеттер
я показал вам выше, который возвращает новый экземпляр объекта недвижимости, но на этот раз с функцией сеттер заменить оформлены способ.Следующей последовательности создает полную собственность, с помощью этих методов декоратор.
Сначала мы создаем некоторые функции и свойства объекта только геттер:
Далее мы будем использовать.метод метода set()` чтобы добавить сеттер:
В прошлом мы добавляем делетер с
.делетер()
метод:Последнее, но не менее важно,
собственность
объект выступает в качестве объект дескриптора, так и.__вам__()
,.__набор__()
и.__удалить__()
методы вклиниться в экземпляр атрибута получения, установки и удаления:В Методические указания дескриптора включает в себя чистом Python пример реализации в
свойство ' ()
тип:Документации он's просто ярлык для создания свойств только для чтения. Так
эквивалентно
Вот минимальный пример того, как `@недвижимости может быть реализовано:
В противном случае "слово" остается метод вместо свойства.
Первая часть проста:
такой же, как и
Следующим шагом будет расширить эту собственность с сеттер и делетер. И это происходит с помощью соответствующих методов:
возвращает новый объект недвижимости, который наследует все от старого
Х
плюс данного сеттер.х.делетер
работает одинаково.Это следующие:
Такой же как:
Такой же как:
Такой же как:
Который так же как и :
Ниже Еще один пример о том, как `@недвижимости может помочь, когда нужно рефакторить код, который берется из здесь (я описываю только он ниже):
Представьте, что вы создали класс "деньги" такой:
и пользователь создает библиотеку в зависимости от этого класса, где он/она использует, например,
Теперь давайте'ы предположим, вы решили изменить свой класс "деньги" и избавиться от
долларов
атрибутыкопеек
, но вместо этого решили только отслеживать общее количество копеек:Если вышеупомянутые пользователь пытается запустить его/ее библиотеке, как раньше
это приведет к ошибке
Это означает, что теперь каждый, кто рассчитывает на вашу оригинальную
деньги
класса придется менять все строки кода, гдедоллары
икопеек
используются, который может быть очень больно... так, как можно было этого избежать? С помощью `@недвижимости!Вот как:
когда мы сейчас называем из нашей библиотеки
он будет работать как ожидалось, и нам не пришлось менять ни строчки кода в нашей библиотеке! На самом деле, мы бы даже не знали, что в библиотеке мы зависим от изменен.
Кроме того,
сеттер
отлично работает:Вы можете использовать
@недвижимости
также в абстрактных классах, я даю минимальный пример here.Я читаю все посты здесь и поняла, что нам может понадобиться реальный пример из жизни. Почему, собственно, у нас есть @недвижимости? Итак, рассмотрим приложение флягу, где вы используете систему проверки подлинности. Вы объявляете модель User
models.py
:В этом коде мы'вэ-то "скрытые" и атрибут
пароль
с помощью@ "имущество", которое запускает
AttributeError` утверждение, когда вы пытаетесь получить к нему доступ напрямую, в то время как мы использовали @недвижимости.сеттер установить функцию password_hash фактической переменной экземпляра``.Сейчас auth/views.py мы можем создать пользователя с:
Пароль атрибут замечать, что приходит из формы регистрации, когда пользователь заполняет форму. Подтверждение пароля происходит на переднем конце С
равно('пароль', сообщение='пароли должны совпадать')
(в случае, если вам интересно, но это'с другой темы, связанные колбу формы).Я надеюсь, что этот пример будет полезен
Этот момент был снят многими людьми там, но здесь прямой смысл, который я искал. Это то, что я чувствую, важно начать с @декоратор собственность. например:-
Вызов функции на "get_config()" и будет работать.
Если вы заметили, я не использовал и" () на" скобки для вызова функции. Это элементарные вещи, которые я искал @оформитель собственность. Так что вы можете использовать вашу функцию как переменную.
Позвольте'ы начать с Python декораторы.
На Python декоратор-это функция, которая помогает добавить некоторые дополнительные функции в уже существующую функцию.
В Python все является объектом. Функции в Python являются объектами первого класса, что означает, что они могут ссылаться на переменную, добавил в списки, переданные в качестве аргументов в другую функцию и т. д.
Рассмотрим следующий фрагмент кода.
Здесь, можно сказать, что функция декоратор модифицированных нашу функцию say_hello и добавили несколько дополнительных строк кода в нем.
Синтаксис Python для декоратора
Позвольте's заключила все, чем в случае, но перед этим позвольте'поговорим о некоторых упс принципа.
Геттеры и сеттеры используются во многих объектно-ориентированных языков программирования для того чтобы обеспечить принцип инкапсуляции данных(рассматривается как объединение данных с методами, которые работают с этими данными.)
Эти методы, конечно, геттер для получения данных и сеттер для изменения данных.
Согласно этому принципу, атрибуты класса изготавливаются частная скрывать и защищать их от других код.
Ага, @недвижимости в основном для Python способ, чтобы использовать геттеры и сеттеры.
Python имеет большое понятие называется свойство, которое делает жизнь объектно-ориентированного программиста гораздо проще.
Давайте предположим, что вы решили сделать класс, который может хранить температуру в градусах Цельсия.
Рефакторинг кода, вот как мы могли бы достичь его собственность.
В Python, собственность ()-это встроенная функция, которая создает и возвращает объект недвижимого имущества.
Объект недвижимости имеет три метода, метода GET(), сеттер () и delete().
Здесь
могли бы быть разбиты,
Следует Отметить:
Теперь вы можете получить доступ к значению температуры в письменной форме.
Мы можем идти дальше и не определять имена get_temperature и set_temperature как они лишние и загрязнять пространство имен класса.
В подходящие для Python способ для решения вышеуказанных проблем является использование @недвижимости.
Примечания -
Как вы можете видеть, код, безусловно, менее изящный.
Теперь давайте'поговорим о один реальный практический сцены.
Позвольте'говорят, что вы создали класс следующим образом:
Теперь давайте'ы также предположим, что наш класс стал популярным среди клиентов, и они начали использовать его в своих программах, они сделали все виды присвоения объекта.
И в один роковой день, доверенный клиент пришел к нам и предложил, что "Х" есть, чтобы быть значением между 0 и 1000, это действительно ужасный сценарий!
Благодаря свойствам он'ы проста: мы создаем версию собственность на "Х" и.
Это здорово, это'т это: вы можете начать с самого простого мыслимые реализации, и вы можете позже перейти на версию собственность без того, чтобы изменить интерфейс! Так что свойства не просто замена для геттеров и сеттеров!
Вы можете проверить эту реализацию здесь
"имущество" - это класс, за
@недвижимости
декоратор.Вы всегда можете проверить это:
Я переписал пример из справки(собственность)
, чтобы показать, что
@недвижимости` синтаксисфункционально идентичного имущества () синтаксис:
Нет никакой разницы, как мы используем свойство, как вы можете видеть.
Чтобы ответить на вопрос
@недвижимости
декоратор реализуется через "имущество" класса.Итак, вопрос в том, чтобы объяснить "имущество" класса немного. Эта линия:
Был инициализации. Мы можем переписать его так:
Смысл
fget
,fset и fdel
:На следующем изображении показано тройняшки мы, от свойства класс`:
__вам__
, `набор " и " удалить там, чтобы быть переопределен]2. Это реализация шаблона дескриптор в Python.Мы также можем использовать свойство
сеттер
,добытчик
иСтиратель
методов, чтобы привязать функцию к имуществу. Проверьте следующий пример. МетодС2
классаС
будет установить свойство два раза.Свойства могут быть объявлены двумя способами.
Вы можете взглянуть на несколько примеров я уже писал о свойства в Python.
Вот еще один пример:
В принципе, так же, как C( объекта ), например, кроме Я'м через Х вместо... Я не'т инициализировать в инит - ... ну.. да, но он может быть удален, потому что X определяется как часть класса....
Вывод:
и если я закомментируйте самостоятельно.х = 1234 в инит тут выход такой:
и если я поставил поле _default = нет на _default = 0 в геттер функцию ( как все геттеры должны иметь значение по умолчанию, но это вовсе'т передает в собственность значения от того, что я'вэ видел, так что вы можете определить его здесь, и он на самом деле это'т плохо, потому что по умолчанию можно определить один раз и использовать его везде ) т. е. физ х( самовыдвижение, помощью _default = 0 ):
Примечание: геттер логика есть просто значение будет манипулировать ею чтобы убедиться, что он манипулировал ею - же для печати заявления...
Примечание: Я'м использоваться для Lua и уметь динамически создавать 10+ помощники, когда я называю одну функцию и я сделал что-то подобное для Python без использования свойств и это работает до определенной степени, но, хотя функции создаются прежде, чем быть используемым, есть еще вопросы, порой их называют до того, как создал что странно, как это'Т закодированные таким образом... я предпочитаю гибкость Луа мета-таблиц и тот факт, что я могу использовать сеттеры / геттеры, а не по существу прямой доступ к переменной... мне нравится, как быстро некоторые вещи могут быть построены с Python, хотя, например, программ с графическим интерфейсом. хотя я шью не может быть возможным без большого количества дополнительных библиотек - если я кодирую его в аутохотки-AutoHotkey я могу напрямую получить доступ к DLL вызывает, что мне нужно, и то же самое можно сделать в Java, С#, C++ и многое другое - может быть, я не'т найти нужную вещь, но для этого проекта я могу переключиться из кожи питона..
Примечание: код выходного сигнала на этом форуме сломано - пришлось добавить пробелы в первой части кода для его работы - для копирования / вставки обеспечат вам преобразовать все пробелы на символы табуляции.... Я использую вкладки для Python, потому что в файле, который составляет 10000 строк размер может быть от 512 Кб до 1 МБ с пробелами и 100 до 200Кб с вкладками, который приравнивает к массовым разница для размер файла, и сокращение времени обработки...
Вкладки также может быть скорректирована для каждого пользователя - так что если вы предпочитаете 2 места по ширине, 4, 8 или все, что вы можете сделать, это означает, что он продуман для разработчиков зрение дефицита.
Примечание: все функции, определенные в классе разве'т правильно отступом из-за ошибки в программном обеспечении форума - обеспечить понизить его, если вы копировать / вставить
Одно замечание: для меня, для Python 2.х,
@недвижимости
ничего'т работу, как рекламируется, когда я'т наследовать отобъект
:но работал когда:
для Python 3, всегда работал.