Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
3 / 1 / 2
Регистрация: 18.04.2017
Сообщений: 20

Патерн программирования Прототип

07.02.2021, 15:43. Показов 1740. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, разбираюсь в паттернах программирования. Дошел до паттерна Прототип (Prototype)
Вот моя реализация:
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
#  Prototype
from interface import implements, Interface
import copy
 
class Prototipe(Interface):
    @classmethod
    def clone(cls, client):
        pass
 
 
class StarNight(implements(Prototipe)):
    _name = "Звездная ночь"
    _painter = "Висент Ван Гог"
    _picture = r"E:\PYTHON\Django\paterns\Prototype\star_night.jpg"
    client = ""
    
    @classmethod
    def clone(cls, client, memo={}):
        _clone_name = copy.deepcopy(cls._name, memo)
        _clone_painter = copy.deepcopy(cls._painter, memo)
        _clone_picture = copy.deepcopy(cls._picture, memo)
        _clone_client = copy.deepcopy(cls.client, memo)
        
        new = StarNight()
        new._name = _clone_name
        new._painter = _clone_painter
        new._picture = _clone_picture
        new.client = _clone_client
 
        return new
 
 
if __name__ == "__main__":
    picture_star_night1 = StarNight.clone("client1")
    picture_star_night2 = StarNight.clone("client2")
    print(id(picture_star_night1._name))
    print(id(picture_star_night2._name))
Как видно id одинаковые, значит picture_star_night1._name и picture_star_night2._name ссылаются на один и тот же объект в памяти. Значит идея паттерна не реализована.
Но когда делаю так:
Python
1
2
3
4
5
6
if __name__ == "__main__":
    picture_star_night1 = StarNight.clone("client1")
    picture_star_night2 = StarNight.clone("client2")
    picture_star_night1._name = "dfvd"
    print(id(picture_star_night1._name))
    print(id(picture_star_night2._name))
Видно что id-шники разные. Подскажите почему так получается? Не могу разобраться. И как сделать так, если это вообще возможно, чтобы изначально id-шники были разные?
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2021, 15:43
Ответы с готовыми решениями:

Патерн "прототип" не работает, выдаёт ошибку "недопустимый вызов нестатической ф-ции", где я в коде ошибка?
Вот мой код... #include <iostream> #include <Windows.h> #include <vector> #define vrom vector<room> using namespace std; ...

Почему у объекта прототип имеет свой прототип?
Приветствую. Насколько я понимаю, все объекты наследуют от глобального объекта, т.е. во внутреннем слоте ] у объекта находится ссылка на...

Патерн на Email
Помогите, пожалуйста, с патерном. Условие: обязательное поле; ■ только буквенные символы, точка, дефис, нижнее подчеркивание; ■...

4
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
07.02.2021, 17:55
Цитата Сообщение от Nick93 Посмотреть сообщение
разбираюсь в паттернах программирования.
привет, просто из интереса, ты из джавы или сишарпа чтоль? в питоне на дактайпинге все прекрасно держится.

Цитата Сообщение от Nick93 Посмотреть сообщение
from interface import implements, Interface
это откуда такой подход? в какой то книге?
0
Эксперт Python
 Аватар для АмигоСП
295 / 108 / 57
Регистрация: 07.12.2016
Сообщений: 209
07.02.2021, 21:26
Nick93, Вам надо побольше почитать про области видимости переменных. Как работает @classmethod. Не до конца понимаю, что хотели изобразить примером. Может это поможет разобраться:
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
class StarNight:
    _name = "Звездная ночь"
    _painter = "Висент Ван Гог"
    _picture = r"E:\PYTHON\Django\paterns\Prototype\star_night.jpg"
 
    def __init__(self, client: str = ''):
        self._client = client
 
    @classmethod
    def clone(cls, value):
        return cls(value)
 
    @property
    def client(self):
        return self._client
 
 
if __name__ == "__main__":
    picture_star_night1 = StarNight.clone("client1")
    picture_star_night2 = StarNight.clone("client2")
    print('1: ', picture_star_night1.client)
    print('2: ', picture_star_night2.client)
    print(id(picture_star_night1.client))
    print(id(picture_star_night2.client))
0
3 / 1 / 2
Регистрация: 18.04.2017
Сообщений: 20
07.02.2021, 22:00  [ТС]
Welemir1, я с C#.
Вообще отталкиваюсь от статьи https://refactoring.guru/ru/de... /prototype
Но пример не оттуда. Там на UML-схеме обозначено что должен быть интерфейс. Вот я и хочу чтобы убедится что правильно понимаю этот паттерн реализовать полностью свой пример.

Добавлено через 3 минуты
АмигоСП, Ваш код ничего не меняет. Если по вашему коду проверить вот это
Python
1
2
3
4
5
6
7
if __name__ == "__main__":
    picture_star_night1 = StarNight.clone("client1")
    picture_star_night2 = StarNight.clone("client2")
    print('1: ', picture_star_night1._name)
    print('2: ', picture_star_night2._name)
    print(id(picture_star_night1._name))
    print(id(picture_star_night2._name))
id-шники будут одинаковы
А в моем коде есть ошибка там, естественно, надо 22 строчку поменять на:
Python
1
_clone_client = copy.deepcopy(client, memo)
тогда результат будет тотже что и у вас.
PS. Ошибка копипаста.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
08.02.2021, 06:11
Nick93, я сам придя в питон из джавы был в шоке но интерфейсов в джава-сишарповском понимании тут нет. И многие паттерны теряют свою суть, ибо нет строгой приватности. Тот пример по ссылке это как раз для джава-подобных языков. Я вам рекомендую почитать книгу или статью конкретно о паттернах в питоне, ибо тут не все так как в других языках. Например декоратор вообще маст-хев и является частью синтаксиса, синглтон -обычное дело, а не бед-праткис, ну и дактайпинг же! Благодаря ему не надо чего то имплементить или наследовать, чтобы подойти для работы какой то функции. А благодаря манки-патчингу можно вообще получить нужные свойства уже на входе, не имея их в коде приложения.

Поэтому стандартный подход с паттернами в питоне не прокатит, вернее будет выглядеть максимально странно, как ваш код выше.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2021, 06:11
Помогаю со студенческими работами здесь

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

MVVM патерн
Всем привет. Уже писал по поводу данного стиля программирования, более менее разобрался, но некоторые вещи не понятны. Допустим у меня...

Оптимизировать Патерн
попробовал реализовать патерн состояния ,но даже не закончив понимаю что слишком много повторяющегося кода толи я чтото не понял толи...

Патерн Decorator для программы
мне нужно использовать паттерн Decorator в моей программе. У меня есть две функции в разных класах void...

Попытка реализовать патерн Singlton
Пытаюсь реализовать сие чудо, накидал заголовочный файл: class AppSettings { public: static AppSettings *getInstance(); ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Установка 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 существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru