__init __ () получил неожиданный аргумент ключевого слова 'connect'

1

У меня проблема с переопределением метода init класса thread. Мне нужно только это, чтобы взять сокет, который я передаю методу init, когда я создаю экземпляр объекта потока. Код класса потока:

class client_handle(threading.Thread):

    conne = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def __init__(self, conne=None):
        threading.Thread.__init__(self, conne=conne)

Когда я создаю объект client_handle, я пишу:

socket_conn, addr = s.accept()
client_thread = client_handle(socket_conn)

Я также искал в других сообщениях, но я не мог решить свою проблему.

Теги:
class
multithreading
sockets
init

2 ответа

2
Лучший ответ

Вы должны назначить conne вручную как атрибут экземпляра. Передача его в качестве аргумента для Thread.__init__ не будет работать (будет установлена как групповой аргумент класса Thread).

from threading import Thread

class ClientHandle(Thread):
    def __init__(self, conne=None):
        super().__init__() # Python 3
        self.conne = conne
  • 0
    Спасибо, это работает. Итак, это создаст атрибут connect, который не существует в классе Thread, верно?
  • 0
    @Rasta Да, это будет для этого нового класса. Вы наследуете от Thread и переопределяете __init__ , это переопределяет унаследованный __init__ поэтому вы должны вызывать __init__() в родительском классе, как и вы. Затем вы расширяете свой новый подкласс новыми добавленными атрибутами.
0

Thread.__init__ не имеет параметра conne, поэтому вам нужно передать значение в качестве позиционного аргумента.

def __init__(self, conne=None):
    threading.Thread.__init__(self, conne)

Кстати, атрибут class client_handle.conne, похоже, не служит никакой цели; вы, вероятно, можете избавиться от него.

Обновление: передача сокета в Thread.__init__ в частности явно неверна, но это относится к любой попытке "придумать" имя параметра, например conne для метода, который не имеет параметра с именем conne.

  • 0
    Не уверен, но есть ли какая-то разница между threading.Thread.__init__(self, conne) и super().__init__(self, conne)
  • 1
    Есть client_handle разница, но она станет очевидной только в подклассе client_handle . threading.Thread.__init__ - это ссылка на определенную функцию; super().__init__ - это ссылка на метод __init__ любого класса, который идет после client_handle в MRO type(self) . Если вы создаете экземпляр client_handle , тем не менее, threading.Thread является следующим классом в MRO, поэтому они эквивалентны. См. Rhettinger.wordpress.com/2011/05/26/super-considered-super для более подробного объяснения.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню