Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 24, 2021 13:42:16

Yaroslam322
Зарегистрирован: 2020-02-24
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Паттерн наблюдатель, абстрактные классы

имеются три класса: сервер, принимающий и отправляющий сообщения клиенту, клиент, отправляющий сообщения на сервер, принимающий их от него, и клиетсий интерфейс, откуда клиент берет текст сообщения и куда вставляет текст сообщения принятого от сервера. Все они связаны через наблюдателя. Клиент подписан на сервер, а интерфейс на клиента. Реализация наблюдателя полностью взята с https://refactoring.guru/ru/design-patterns/observer/python/example

При обращении к методу(send_data) сервера, ответственному за уведомление(о новом сообщении) и обновление клиента, вылазит ошибка. AttributeError: ‘Server’ object has no attribute ‘Client_socket’.

Сервер

 class Server(Subject):
    def __init__(self):
        self._state = None
        self._observers = []
        self.users_ip = []
        self.users_port = []
        self.Users = UserDB()
        self.attach(CLient_socket)
        self.start_server()   
 
def attach(self, observer):
        print("Subject: Attached an observer.")
        self._observers.append(observer)
    def detach(self, observer):
        self._observers.remove(observer)
    def send_data(self, data, connection): #обновление и уведомление клиента
        send_ip = (self.Users.get_ip_by_id(data['to']))
        Json_str = json.dumps(data, ensure_ascii=False).encode("utf-8")
        i = self.users_ip.index(send_ip)
        connection.sendto(Json_str, (self.users_ip[i], self.users_port[i]))
        self._observers[i].get_data(self) #get_data - метод клиента здесь и возникает ошибка

Клиент
 class CLient_socket(Observer, Subject): #одновременно издатель и наблюдатель
    def __init__(self):
        from main import Massenger
        self._observers = []
        self.attach(Massenger)
        self.Client_socket = socket.socket()
    def get_data(self):
        data = self.Client_socket.recv(1024)
        if not data:
            return 0
        else:
            self._observers[0].render_messages(self, data)
    def attach(self, observer):
        print("Subject: Attached an observer.")
        self._observers.append(observer)
    def detach(self, observer):
        self._observers.remove(observer)

Офлайн

#2 Авг. 24, 2021 18:28:29

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Паттерн наблюдатель, абстрактные классы

приведенных фрагментов недостаточно для воспроизведения проблемы



Офлайн

#3 Авг. 24, 2021 19:01:22

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Паттерн наблюдатель, абстрактные классы

Тебе этот “наблюдатель” нафиг не нужен. Возьми справочник Бизли, там подробно описана схема клиент-серверного взаимодействия по протоколу TCP. Делай всё по книге и не придумывай ничего лишнего.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Авг. 24, 2021 20:46:39

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Паттерн наблюдатель, абстрактные классы

Yaroslam322
AttributeError: ‘Server’ object has no attribute ‘Client_socket’.
Ну так у вас его и нету. Покажите в вашем коде где у класса Server атрибут Client_socket?
Сначала вы добавляете в _observers класс CLient_socket. Заметте, не инстанс(экземпляр), а именно класс.
А потом делаете феерическое :
 self._observers[i].get_data(self)
self._observers(i) это класс CLient_socket, тоесть вы делаете CLient_socket.get_data(self), где self инстанс класса Server.
  Тоесть в итоге self._observers[i].get_data(self) разворачивается в CLient_socket.get_data(<class_Server_instance>)
В котором у вас есть строчка data = self.Client_socket.recv(1024), но так как вы первым аргументом передаете <class_Server_instance> то оно ищет Атрибут Сlient_socket сначала в инстанcе, а потом в клессе ‘Server’, не находит и кидает исключение.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Авг. 24, 2021 21:00:14)

Офлайн

#5 Авг. 25, 2021 21:35:02

Yaroslam322
Зарегистрирован: 2020-02-24
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Паттерн наблюдатель, абстрактные классы

PEHDOM
Спасибо, разобрался с этим, оказывается я немного не правильно использовал наблюдателя, передавая в Attach просто имя класса, а не имя_класса(), из-за этого и возникала подобная ошибка

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version