Рубрики
Без рубрики

Как использовать декоратор недвижимости Python?

И снова здравствуйте! В этой статье мы посмотрим на декоратор недвижимости Python.

Автор оригинала: 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 характеристики!

Это именно почему недвижимость – тяжело используется в современных проектах с открытым исходным кодом.

Они делают его чрезвычайно простым для конечного пользователя, а также облегчают разработчики для разделения скрытых атрибутов из не скрытых свойств!

Рекомендации