почему эта команда run() выполняется без какого-либо вызова?

#python #multithreading #class #pynput

#python #многопоточность #класс #pynput

Вопрос:

итак, я возился с python, когда наткнулся на этот код автоклика в Интернете

 import time
import threading
from pynput.mouse import Button, Controller
from pynput.keyboard import Listener, KeyCode


delay = 0.001
button = Button.left
start_stop_key = KeyCode(char='s')
exit_key = KeyCode(char='e')


class ClickMouse(threading.Thread):
    def __init__(self, delay, button):
        super(ClickMouse, self).__init__()
        self.delay = delay
        self.button = button
        self.running = False
        self.program_running = True

    def start_clicking(self):
        self.running = True

    def stop_clicking(self):
        self.running = False

    def exit(self):
        self.stop_clicking()
        self.program_running = False

    def run(self):
        while self.program_running:
            while self.running:
                mouse.click(self.button)
                time.sleep(self.delay)
            time.sleep(0.1)


mouse = Controller()
click_thread = ClickMouse(delay, button)
click_thread.start()


def on_press(key):
    if key == start_stop_key:
        if click_thread.running:
            click_thread.stop_clicking()
        else:
            click_thread.start_clicking()
    elif key == exit_key:
        click_thread.exit()
        listener.stop()


with Listener(on_press=on_press) as listener:
    listener.join()
  

после небольшого исследования я понимаю большую часть этого, но меня все еще смущает одна вещь,
почему команда run() в классе работает автоматически, даже если ее никто не вызывает? в этом коде нет ни одного другого «run»

заранее спасибо

Комментарии:

1. Ваш код вызывает ‘start()’, который сам вызывает ‘run()’

2. @quamrana, это вводит в заблуждение. start() Метод не вызывает run() метод. start() Метод создает новый собственный поток, и что-то в новом потоке вызывает run() метод.

Ответ №1:

Это типичный шаблон «многопоточности». Сначала вы создаете подкласс «Thread» и переопределяете run() метод.

После этого вы создаете экземпляр этого класса, который вы видите здесь:

 click_thread = ClickMouse(delay, button)
click_thread.start()
  

Метод «start» запускает поток, который использует функцию «run». Итак, строка, которая эффективно «запускает run() метод», является click_thread.start() .

Вы можете найти более подробную информацию в документах threading.Нитки