У меня проблема с переопределением метода 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)
Я также искал в других сообщениях, но я не мог решить свою проблему.
Вы должны назначить conne
вручную как атрибут экземпляра. Передача его в качестве аргумента для Thread.__init__
не будет работать (будет установлена как групповой аргумент класса Thread).
from threading import Thread
class ClientHandle(Thread):
def __init__(self, conne=None):
super().__init__() # Python 3
self.conne = conne
Thread.__init__
не имеет параметра conne
, поэтому вам нужно передать значение в качестве позиционного аргумента.
def __init__(self, conne=None):
threading.Thread.__init__(self, conne)
Кстати, атрибут class client_handle.conne
, похоже, не служит никакой цели; вы, вероятно, можете избавиться от него.
Обновление: передача сокета в Thread.__init__
в частности явно неверна, но это относится к любой попытке "придумать" имя параметра, например conne
для метода, который не имеет параметра с именем conne
.
threading.Thread.__init__(self, conne)
и super().__init__(self, conne)
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 для более подробного объяснения.
Thread
и переопределяете__init__
, это переопределяет унаследованный__init__
поэтому вы должны вызывать__init__()
в родительском классе, как и вы. Затем вы расширяете свой новый подкласс новыми добавленными атрибутами.