Найти - Пользователи
Полная версия: Паттерн наблюдатель, абстрактные классы
Начало » Python для новичков » Паттерн наблюдатель, абстрактные классы
1
Yaroslam322
имеются три класса: сервер, принимающий и отправляющий сообщения клиенту, клиент, отправляющий сообщения на сервер, принимающий их от него, и клиетсий интерфейс, откуда клиент берет текст сообщения и куда вставляет текст сообщения принятого от сервера. Все они связаны через наблюдателя. Клиент подписан на сервер, а интерфейс на клиента. Реализация наблюдателя полностью взята с 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)
doza_and
приведенных фрагментов недостаточно для воспроизведения проблемы
Rodegast
Тебе этот “наблюдатель” нафиг не нужен. Возьми справочник Бизли, там подробно описана схема клиент-серверного взаимодействия по протоколу TCP. Делай всё по книге и не придумывай ничего лишнего.
PEHDOM
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’, не находит и кидает исключение.
Yaroslam322
PEHDOM
Спасибо, разобрался с этим, оказывается я немного не правильно использовал наблюдателя, передавая в Attach просто имя класса, а не имя_класса(), из-за этого и возникала подобная ошибка
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB