Форум сайта python.su
0
имеются три класса: сервер, принимающий и отправляющий сообщения клиенту, клиент, отправляющий сообщения на сервер, принимающий их от него, и клиетсий интерфейс, откуда клиент берет текст сообщения и куда вставляет текст сообщения принятого от сервера. Все они связаны через наблюдателя. Клиент подписан на сервер, а интерфейс на клиента. Реализация наблюдателя полностью взята с 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)
Офлайн
253
приведенных фрагментов недостаточно для воспроизведения проблемы
Офлайн
186
Тебе этот “наблюдатель” нафиг не нужен. Возьми справочник Бизли, там подробно описана схема клиент-серверного взаимодействия по протоколу TCP. Делай всё по книге и не придумывай ничего лишнего.
Офлайн
294
Yaroslam322Ну так у вас его и нету. Покажите в вашем коде где у класса Server атрибут Client_socket?
AttributeError: ‘Server’ object has no attribute ‘Client_socket’.
self._observers[i].get_data(self)
Тоесть в итоге self._observers[i].get_data(self) разворачивается в CLient_socket.get_data(<class_Server_instance>)
[code python][/code]
Отредактировано PEHDOM (Авг. 24, 2021 21:00:14)
Офлайн
0
PEHDOMСпасибо, разобрался с этим, оказывается я немного не правильно использовал наблюдателя, передавая в Attach просто имя класса, а не имя_класса(), из-за этого и возникала подобная ошибка
Офлайн