wzorzec obserwator w pythonie

0

Cześć,
mam problem z implemetacją wzorca projektowego "obserwator". Chciałem zrobić, że gdy wpisze coś do notatnika to wszyscy obserwatorzy zostaną o tym powiadomieni.

Na tą chwilę niemoge dodać obserwatora do listy a już nie mówię o ich poinformowaniu.

Obecnie logika czyli wporawdzanie tekstu do pliku i sprawdzenie pliku przed i po wpisaniu działa. Czego mi brakuje?, co robię źle?, co pominąłem?

class produkt_plik:

    _lista_obserwatorow_produktu_plik = []

    def __init__(self, sta):
        self.sta = sta

    def attach(self, observer):
        self._lista_obserwatorow_produktu_plik.append(observer)
        print("Przedmiot informuje: dodano obserwatora")

    def detach(self, _lista_obserwatorow_produktu_plik):
        self._lista_obserwatorow_produktu_plik.remove(observer)
        print("Przedmiot informuje: usunieto obserwatora")

    def notify(self):
        print("Powiadamiam obserwatorow")
        for observer in self._lista_obserwatorow_produktu_plik:
            observer.update(self)


class main_obserwator:
    def update(self):
        pass


class obserwatorA(main_obserwator):
    def __init__(self, name):
        self.name = name
    def update(self):
        print('{} info dla ciebie'.format(self.name))

Tak chciałem dodać obserwatora do listy

p = produkt_plik(0)
observer_a = obserwatorA("Jan")
ll = p._lista_obserwatorow_produktu_plik
ll.attach(observer_a)

A taki komunikat dostaje:

ll.attach(observer_a)
AttributeError: 'list' object has no attribute 'attach'

1

To moze poczytaj o tym jeszcze raz

https://refactoring.guru/design-patterns/observer

Aczkolwiek ten konkretny blad nie wynika ze slabej implementacji tylko z tego, ze odpalasz metode na liscie a chcialbys na tej swojej klasie.
ll = p._lista_obserwatorow_produktu_plik - o tutaj masz liste. Swoja droga fatalne nazewnictwo stosujesz :(

A tutaj dzialajacy przyklad:

https://refactoring.guru/design-patterns/observer/python/example

0

Właśnie z tego korzystałem i czytałem

To proszę wyjaśnij mi co oznacza w obserwatorze

subject: Subject
1

Chodzi Ci o : Subject? To typ z PEP484
https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html

A w kodzie wczesniej masz class Subject(ABC):

0

Tak wiem że w kodzie jest klasa Subject, ale subject: Subject czy to jakieś wyrażenie ? Czy jakieś odwołanie? Czy utworzenie obiektu Subject w subject? Zastanawia mnie znak ":" nie spotkałem się z nim nigdy wcześniej

0

Mówisz że nie odwołuje się do listy, ale w metodzie def attach podaję listę gdzie ma zostać zapisany obserwator

2

Nie miales nigdy do czynienia z typowanymi jezykami? To nie jest typowanie z prawdziwego zdarzenia ale mowi mniej wiecej, ze subject jest typu Subject.
Tak jak np. x: Int = 3.

ll = p._lista_obserwatorow_produktu_plik
ll.attach(observer_a)

tutaj odwolujesz sie do listy a masz sie odwolac do produkt_plik (fatalna nazwa).

Btw bierzesz sie za wzorce projektowe a chyba nawet OOP nie ogarniasz. Po kolei, po kolei :)

0

O sz.... faktycznie uciekło mi p :(
Dzięki za pomoc

0

I jeszcze pytanie mam jedno, dlaczego w obserwatorze w taki sposób typujemy
subject: Subject
observer: Observer
i dodatkowo ustawiany je na None

1

Tu nie chodzi o obserwatora ale dobre praktyki programistyczne :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1