Автор оригинала: Pankaj Kumar.
Как использовать декоратор недвижимости Python?
И снова здравствуйте! В этой статье мы посмотрим на декоратор недвижимости Python.
Python имеет очень полезную функцию, называемую декораторами, которая является просто синтаксическим сахаром для функциональных оболочек. Здесь мы будем сосредоточиться на декоратере свойства, который является специальным типом декоратора.
Эта тема может быть немного запутанной для вас, поэтому мы будем покрывать его поэтапным, используя иллюстративные примеры. Давайте начнем!
На основании декоратора свойства Python на основе?
Декоратор недвижимости основан на встроенном Собственность ()
функция. Эта функция возвращает специальную Недвижимость
объект.
Вы можете назвать это в вашем переводчике Python и посмотреть:
>>> property()
Это Недвижимость
Объект имеет несколько дополнительных методов, для получения и установки значений объекта. Он также имеет способ удаления его.
Список методов приведен ниже:
Собственность (). Getter
Собственность (). Setter
Собственность (). Удаленный
Но там не останавливается! Эти методы могут быть использованы на других объектах и действовать как самих декораторов!
Так, например, мы можем использовать Собственность (). Getter (OBJ)
, что даст нам другой объект недвижимости!
Итак, вещь, которую следует отметить, что декоратор недвижимости будет использовать эту функцию, которая будет иметь некоторые специальные методы чтения и записи на объект. Но как это помогает нам?
Давайте посмотрим сейчас.
Использование декоратора свойства Python
Чтобы использовать декоратор свойств, нам нужно обернуть его вокруг любой функции/метода.
Вот простой пример:
@property def fun(a, b): return a + b
Это так же, как:
def fun(a, b): return a + b fun = property(fun)
Так вот, мы обертываем Собственность ()
вокруг Веселье ()
, что именно то, что делает декоратор!
Давайте теперь возьмем простой пример, используя декоратор свойств на методе класса.
Рассмотрим класс ниже, без каких-либо украшенных методов:
class Student(): def __init__(self, name, id): self.name = name self.id = id self.full_id = self.name + " - " + str(self.id) def get_name(self): return self.name s = Student("Amit", 10) print(s.name) print(s.full_id) # Change only the name s.name = "Rahul" print(s.name) print(s.full_id)
Выход
Amit Amit - 10 Rahul Amit - 10
Здесь, как вы можете видеть, когда мы меняем только Имя
Атрибут нашего объекта, это ссылка на full_id
Атрибут все еще не обновляется!
Чтобы гарантировать, что full_id
Атрибут также обновляется всякий раз, когда Имя
или ID
обновляется, одно решение может быть сделано full_id
вместо этого метода.
class Student(): def __init__(self, name, id): self.name = name self.id = id def get_name(self): return self.name # Convert full_id into a method def full_id(self): return self.name + " - " + str(self.id) s = Student("Amit", 10) print(s.name) # Method call print(s.full_id()) s.name = "Rahul" print(s.name) # Method call print(s.full_id())
Выход
Amit Amit - 10 Rahul Rahul - 10
Здесь мы решили нашу проблему, конвертируя full_id
в метод full_id ()
Отказ
Тем не менее, это не лучший способ решать эту проблему, так как вам может потребоваться преобразовать все такие атрибуты в метод вместо этого, и изменить атрибуты в вызовы методов. Это не удобно!
Чтобы уменьшить нашу боль, мы можем использовать @Property
Декоратор вместо этого!
Идея состоит в том, чтобы сделать full_id ()
в метод, но приложите его с помощью @Property
Отказ Таким образом, мы сможем обновить full_id
, без необходимости лечить его как функциональный вызов.
Мы можем напрямую сделать это: s.full_id
Отказ Обратите внимание, что здесь нет звонка метода. Это из-за декоратора собственности.
Давайте попробуем это сейчас!
class Student(): def __init__(self, name, id): self.name = name self.id = id def get_name(self): return self.name @property def full_id(self): return self.name + " - " + str(self.id) s = Student("Amit", 10) print(s.name) # No more method calls! print(s.full_id) s.name = "Rahul" print(s.name) # No more method calls! print(s.full_id)
Выход
Amit Amit - 10 Rahul Rahul - 10
Действительно, это сейчас работает! Теперь нам не нужно звонить full_id
используя скобки.
Хотя он все еще является методом, декоратор имущества маскирует, что и относится к этому, как будто это свойство класса! Разве название не имеет смысла сейчас!?
Использование свойства с установкой
В приведенном выше примере подход работал, потому что мы явно не изменили full_id
недвижимость напрямую. По умолчанию, используя @Property
делает эту собственность только только для чтения.
Это означает, что вы не можете явно изменить свойство.
s.full_id = "Kishore" print(s.full_id)
Выход
---> 21 s.full_id = "Kishore" 22 print(s.full_id) AttributeError: can't set attribute
Очевидно, у нас нет разрешений, поскольку имущество только для чтения!
Чтобы сделать недвижимость с записью, помните Собственность (). Setter
Метод мы говорили, что тоже декоратор?
Оказывается, мы можем добавить еще один full_id
Свойство, использующее @ full_id.setter
, чтобы сделать его жареным. @ full_id.setter
наследут все в оригинале full_id
Собственность, поэтому мы можем добавить его напрямую!
Однако мы не можем напрямую использовать full_id
Недвижимость в нашем сеттереве. Обратите внимание, что это приведет к бесконечному спуску рекурсии!
class Student(): def __init__(self, name, id): self.name = name self.id = id def get_name(self): return self.name @property def full_id(self): return self.name + " - " + str(self.id) @full_id.setter def full_id(self, value): # Infinite recursion depth! # Notice that you're calling the setter property of full_id() again and again self.full_id = value
Чтобы избежать этого, мы будем добавлять скрытый атрибут _full_id
в наш класс. Мы изменим @Property
Декоратор, чтобы вернуть этот атрибут вместо этого.
Обновленный код теперь будет выглядеть так:
class Student(): def __init__(self, name, id): self.name = name self.id = id self._full_id = self.name + " - " + str(self.id) def get_name(self): return self.name @property def full_id(self): return self._full_id @full_id.setter def full_id(self, value): self._full_id = value s = Student("Amit", 10) print(s.name) print(s.full_id) s.name = "Rahul" print(s.name) print(s.full_id) s.full_id = "Kishore - 20" print(s.name) print(s.id) print(s.full_id)
Выход
Amit Amit - 10 Rahul Amit - 10 Rahul 10 Kishore - 20
Мы успешно сделали full_id
Недвижимость имеет добыточные и сеттерные атрибуты!
Заключение
Надеюсь, это дало вам лучшее понимание декоратора недвижимости, а также, почему вам может потребоваться использовать классные атрибуты, такие как _full_id
Отказ
Эти атрибуты скрытых классов (например, _full_id
) сделать это действительно легко для нас использовать внешнюю full_id
характеристики!
Это именно почему недвижимость – тяжело используется в современных проектах с открытым исходным кодом.
Они делают его чрезвычайно простым для конечного пользователя, а также облегчают разработчики для разделения скрытых атрибутов из не скрытых свойств!
Рекомендации
- Stackoverflow вопрос на недвижимости