Проблема заключается в том, что метод download ожидает аргумент self, который представляет собой ссылку на конкретный экземпляр класса.
def download(link, path, mp, self): # требуется self аргументом
l = 0
self.change_value.emit(l) # используется self
...
Но в вашем коде этот метод вызывается следующим образом:
Progress.download(link, path, mp) # Метод вызывается у класса, никакие экземпляры не передаются
Можно написать следующий код, и он будет работать:
...
progress = Progress() # создание экземпляра класса
thread = Progress.download(link, path, mp, progress) # вызов метода и передача экземпляра класса
self.thread.start()
Однако, более хорошей практикой является расположение аргумента self первым в методе. В питоне можно вызывать методы напрямую у экземпляра класса, и тогда ссылка на этот экземпляр будет передаваться автоматически, первым аргументом, обычно называемым self.
Код может выглядеть так:
...
def download(self, link, path, mp,): # ставим self первым
l = 0
self.change_value.emit(l)
...
...
progress = Progress() # создание экземпляра класса
thread = progress.download(link, path, mp) # то же самое что и Progress.download(progress, link, path, mp)
self.thread.start()