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

Pythonic код: декоратор недвижимости

Этот пост продолжает серию в коде «Pythonic». Код Pythonic – код, который хорошо подходит с дизайном … Теги с Python.

Этот пост продолжает серию в коде «Pythonic». Код Pythonic – код, который хорошо подходит с дизайном языка Python. Мой предыдущий пост посмотрел на С заявлением и упрощая настройка и разрыв кода. Этот третий пост рассмотрит Недвижимость декоратор.

Декоратор недвижимости

Если вы когда-либо принимали класс на объекте ориентированного (OO) дизайна, то вы, вероятно, преподавали значение инкапсуляции. Вам сказали, что вы должны держать состояние ваших объектов частным, чтобы вы могли бы изменить внутренние органы класса, как вы видите подходящие. Это благородная цель, и она пользуется вам чрезвычайно.

Если курс был в Java, инкапсуляция быстро перевела себя в Getter и Getters на ваши классы. Приходя к Python, может быть, ваш первый класс выглядит так:

class OhMyJava:

    def __init__(self):
        self._foo = ''

    def get_foo(self):
        return self._foo

    def set_foo(self, foo):
        self._foo = foo

Если бы я должен был просмотреть свой код, я мог бы предложить альтернативу.

class AwwYeah:

    def __init__(self):
        self.foo = ''

КАКИЕ!? Но, как я смею нарушать инкапсуляцию? Что происходит, когда нужно изменить, а Foo нужно создавать динамически от бар Отказ Разве это не сломает никого, кто использовал код?

Дизайнеры Python Language определили, что получение и настройки атрибутов непосредственно чувствуют себя намного очиститель, чем методы Gotter и Setter. Контрастно это:

obj.set_result(other.get_foo() + other.get_bar())
# vs.
obj.result = other.foo + other.bar

Я надеюсь, что вы согласитесь с дизайнерами языка, которые последнее легче понять. Чтобы сделать этот стиль возможным, язык нужен какой-то способ достичь того, что они хотели, не нарушая инкапсуляцию.

Введите Недвижимость декоратор.

Движение Genius было добавление новой языковой функции, которая позволяет расширить свой класс, не нарушая API, который вы определили. В нашем примере Foo является публичным API. Давайте продлим наш код.

class AwwYeah:

    def __init__(self):
        self._bar = ''

    @property
    def foo(self):
        return 'More awesome please: {}'.format(self._bar)

    @foo.setter
    def foo(self, value):
        self._bar = '{} is great.'.format(value)

>>> a = AwwYeah()
>>> a.foo = 'Python'
>>> a.foo
'More awesome please: Python is great.'

Недвижимость Декоратор – наше тайное оружие, чтобы предотвратить заглушки инкамуляции. Этот новый класс меняет, что Foo значит без нарушения пользователей класса.

Использование Недвижимость Как декоратор создает метод Getter. Это разница между a.foo () и a.foo.foo. . Это кажется незначительным, но те скобки складываются. Недвижимость Декоратор позволяет Masquerade метод в виде атрибута простого объекта.

Кроме того, вы можете создать метод сеттера (I.E. @ foo.setter ) до тех пор, пока имя до .setter Соответствует названию метода оформленного свойства. Когда вы не включаете метод сеттера, свойство только для чтения и будет поднять AttributeError. Если вы пытаетесь его установить.

Создание методов Getter и Setter, добавив декоратор, является мощным инструментом, который приводит к исключительно чистому коду. Недвижимость Декоратор разблокирует что-то потрясающее для нас:

Вы можете сделать все возможное, пока вам не нужно больше контроля Отказ

Эта характеристика позволяет разработчикам быстро и кратко написать код. Если вы хотите узнать больше о Недвижимость проверить Документация Отказ Итак, идите и перестаньте написать методы Gotter и сеттера Java в вашем Python!:)

Эта статья впервые появилась на mattlayman.com Отказ

Оригинал: “https://dev.to/mblayman/pythonic-code-the-property-decorator-3c54”