Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708

Декоратор @abc.abstractproperty

24.08.2020, 20:23. Показов 4736. Ответов 5

Студворк — интернет-сервис помощи студентам
Пожалуйста объясните в каких случаях применяется декоратор модуля abc, @abstractproperty, чем он отличается от @abstractmethod и используется или нет в версиях python выше 3.3?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.08.2020, 20:23
Ответы с готовыми решениями:

Декоратор
Не могу понять зачем использовать в декораторах from functool import wraps вот пример с @wraps и без wraps и работают одинаково. Для...

Декоратор
Хочу написать шнягу, чтобы выводилось время работы функции... решил сделать с помощью декоратора; не работает. Тогда попробовал написать...

Декоратор lru_cache
Добрый вечер! Недавно наткнулся на такой декоратор, как lru_cache. Как уже можно было догадаться, он организует для функции свой...

5
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
24.08.2020, 20:52
AlexMarkov, а чего сразу в доку не пошел?

Deprecated since version 3.3
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
24.08.2020, 20:58  [ТС]
Welemir1, я прямиком оттуда и запостил тему. Не понятен контекст содержимого, не применяется в совокупности с декоратором @property или вообще не применяется, а используется @abstractmethod. Так что такое @abstractproperty?
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
24.08.2020, 23:00
AlexMarkov, В поисковике полно ссылок на эту тему. Вот например первая из них.
https://stackoverflow.com/ques... ct-classes
Но что бы разобраться, нужно хорошо понимать, что такое Абстрактные классы и что такое Декораторы.

Добавлено через 7 минут
А вот здесь использование @abstractproperty в метоклассах
https://python.hotexamples.com... mples.html

Материала полно, изучайте. Но тема достаточно сложная.
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
25.08.2020, 05:38
AlexMarkov, ну там прямо написано что депрекат и с расширением возможностей абстратметода - стал не нужен. Про абстрактпроперти вот только от тебя и узнал.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
25.08.2020, 22:10  [ТС]
@property позволяет преобразовать метод класса в атрибут класса.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# -*- coding: utf-8 -*-
 
class Person(object):
    """"""
    def __init__(self, first_name, last_name):
        """Конструктор"""
        self.first_name = first_name
        self.last_name = last_name
    
    @property
    def full_name(self):
        """
        Возвращаем полное имя
        """
        return "%s %s" % (self.first_name, self.last_name)
Позволяет использовать следующий код:
Python
1
2
3
4
5
6
7
8
9
10
person = Person("Mike", "Driscoll")
 
print(person.full_name) # Mike Driscoll
print(person.first_name) # Mike
 
person.full_name = "Jackalope"
 
Traceback (most recent call last):
    File "<string>", line 1, in <fragment>
AttributeError: can't set attribute
Теперь можно использовать property, property.getter(), property.setter()и property.deleter() с abstractmethod(), что делает этот декоратор @abstractproperty излишним. Декоратор теперь правильно идентифицируется как абстрактный при применении к абстрактному методу начиная с версии 3.3.

Просматривал псевдокод паттерна Builder:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
from __future__ import annotations
from abc import ABC, abstractmethod, abstractproperty
from typing import Any
 
 
class Builder(ABC):
    """
    Интерфейс Строителя объявляет создающие методы для различных частей объектов
    Продуктов.
    """
 
    @abstractproperty
    def product(self) -> None:
        pass
 
    @abstractmethod
    def produce_part_a(self) -> None:
        pass
 
    @abstractmethod
    def produce_part_b(self) -> None:
        pass
 
    @abstractmethod
    def produce_part_c(self) -> None:
        pass
 
 
class ConcreteBuilder1(Builder):
    """
    Классы Конкретного Строителя следуют интерфейсу Строителя и предоставляют
    конкретные реализации шагов построения. Ваша программа может иметь несколько
    вариантов Строителей, реализованных по-разному.
    """
 
    def __init__(self) -> None:
        """
        Новый экземпляр строителя должен содержать пустой объект продукта,
        который используется в дальнейшей сборке.
        """
        self.reset()
 
    def reset(self) -> None:
        self._product = Product1()
 
    @property
    def product(self) -> Product1:
        """
        Конкретные Строители должны предоставить свои собственные методы
        получения результатов. Это связано с тем, что различные типы строителей
        могут создавать совершенно разные продукты с разными интерфейсами.
        Поэтому такие методы не могут быть объявлены в базовом интерфейсе
        Строителя (по крайней мере, в статически типизированном языке
        программирования).
 
        Как правило, после возвращения конечного результата клиенту, экземпляр
        строителя должен быть готов к началу производства следующего продукта.
        Поэтому обычной практикой является вызов метода сброса в конце тела
        метода getProduct. Однако такое поведение не является обязательным, вы
        можете заставить своих строителей ждать явного запроса на сброс из кода
        клиента, прежде чем избавиться от предыдущего результата.
        """
        product = self._product
        self.reset()
        return product
 
    def produce_part_a(self) -> None:
        self._product.add("PartA1")
 
    def produce_part_b(self) -> None:
        self._product.add("PartB1")
 
    def produce_part_c(self) -> None:
        self._product.add("PartC1")
 
 
class Product1():
    """
    Имеет смысл использовать паттерн Строитель только тогда, когда ваши продукты
    достаточно сложны и требуют обширной конфигурации.
 
    В отличие от других порождающих паттернов, различные конкретные строители
    могут производить несвязанные продукты. Другими словами, результаты
    различных строителей могут не всегда следовать одному и тому же интерфейсу.
    """
 
    def __init__(self) -> None:
        self.parts = []
 
    def add(self, part: Any) -> None:
        self.parts.append(part)
 
    def list_parts(self) -> None:
        print(f"Product parts: {', '.join(self.parts)}", end="")
 
 
class Director:
    """
    Директор отвечает только за выполнение шагов построения в определённой
    последовательности. Это полезно при производстве продуктов в определённом
    порядке или особой конфигурации. Строго говоря, класс Директор необязателен,
    так как клиент может напрямую управлять строителями.
    """
 
    def __init__(self) -> None:
        self._builder = None
 
    @property
    def builder(self) -> Builder:
        return self._builder
 
    @builder.setter
    def builder(self, builder: Builder) -> None:
        """
        Директор работает с любым экземпляром строителя, который передаётся ему
        клиентским кодом. Таким образом, клиентский код может изменить конечный
        тип вновь собираемого продукта.
        """
        self._builder = builder
 
    """
    Директор может строить несколько вариаций продукта, используя одинаковые
    шаги построения.
    """
 
    def build_minimal_viable_product(self) -> None:
        self.builder.produce_part_a()
 
    def build_full_featured_product(self) -> None:
        self.builder.produce_part_a()
        self.builder.produce_part_b()
        self.builder.produce_part_c()
 
 
if __name__ == "__main__":
    """
    Клиентский код создаёт объект-строитель, передаёт его директору, а затем
    инициирует процесс построения. Конечный результат извлекается из объекта-
    строителя.
    """
 
    director = Director()
    builder = ConcreteBuilder1()
    director.builder = builder
 
    print("Standard basic product: ")
    director.build_minimal_viable_product()
    builder.product.list_parts()
 
    print("\n")
 
    print("Standard full featured product: ")
    director.build_full_featured_product()
    builder.product.list_parts()
 
    print("\n")
 
    # Помните, что паттерн Строитель можно использовать без класса Директор.
    print("Custom product: ")
    builder.produce_part_a()
    builder.produce_part_b()
    builder.product.list_parts()
Данный декоратор позволяет установить договоренность на обязательное декорирование метода наследуемого класса, используя @property, правильно я понимаю? В чём смысл использования @abstractproperty в данном шаблоне и возможно или нет заменить его на соответствующее документации?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from __future__ import annotations
from abc import ABC, abstractmethod, abstractproperty
from typing import Any
 
 
class Builder(ABC):
    """
    Интерфейс Строителя объявляет создающие методы для различных частей объектов
    Продуктов.
    """
    @property
    @abstractmethod
    def product(self) -> None:
        pass
 
    @abstractmethod
    def produce_part_a(self) -> None:
        pass
 
    @abstractmethod
    def produce_part_b(self) -> None:
        pass
 
    @abstractmethod
    def produce_part_c(self) -> None:
        pass
Добавлено через 3 часа 21 минуту
Цитата Сообщение от AlexMarkov Посмотреть сообщение
обязательное декорирование метода наследуемого класса, используя @property, правильно я понимаю?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- coding: utf-8 -*-
"""
Модуль с примером использования @abstractmethod и @property
"""
from abc import ABC,abstractmethod,abstractproperty
 
 
class Name(ABC):
    @abstractmethod
    def __init__(self):
        pass
        
    @property # преобразует метод класса в атрибут класса
    @abstractmethod 
    def full_name(self):
        pass
    
class Person(Name):
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name
  
    def full_name(self):
        return self.first_name + self.last_name
    
if __name__=='__main__':
    x = Person('Rick', 'Martin')
    x.full_name = 'Jhon'
    print(x.full_name)
В случае отсутствия @property не генерирует исключение? Не понимаю смысл использования данных декораторов? Если можно задекорировать @property в наследуемом классе, зачем в абстрактном классе использовать данные декораторы если никаких исключений не генерируется?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.08.2020, 22:10
Помогаю со студенческими работами здесь

Как задать декоратор лямбда функцией?
Предположим есть такой декоратор: def decorator(func): def wrapped(a, b): return func(b, a) return wrapped @decorator ...

Настроить декоратор на работу по дефолту (timeout=0)
есть декоратор: def timeoutf(timeout: int = 0): &quot;&quot;&quot; decorator, execute function with timeout :param timeout: int,...

Декоратор, изменяющий возвращаемое значение + type hints
Имеется декоратор с одним параметром. Декоратор convert_return преобразовывает результат декорируемой функции с помощью другой функции. ...

Написать простой декоратор, используя декоратор wraps, для передачи данных от оригинальной функции
На python Написать простой декоратор, используя декоратор wraps, для передачи данных от оригинальной функции. Реализовать простую функцию...

Декоратор
Нужно создать декоратор который будет обрамлять введенный текст знаком &quot;=&quot;. Вывод должен быть таким: ========== =Hello, World!= ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru