Почему это AttributeError?

Я очень плохо знаком с Python и пытался использовать хорошую библиотеку ( audiotools) для воспроизведения плейлиста в формате mp3, просто как упражнение.

Это класс для воспроизведения треклиста (в общем, на основе ЭТОГО, как только я обнаружил, что есть "функция обратного вызова без аргументов, которая вызывается игроком, когда текущий трек закончен" (*)):

class Trackplay:
    def __init__(self,
                 track_list,
                 audio_output=audiotools.player.open_output('ALSA'),
                 replay_gain=audiotools.player.RG_NO_REPLAYGAIN):

        self.track_index = INDEX - 1
        self.track_list = track_list

        self.player = audiotools.player.Player(
                audio_output,
                replay_gain,
                self.next_track())

    def next_track(self):
        try:
            self.track_index += 1
            current_track = self.track_list[self.track_index]
            print str(current_track)
            audio_file = audiotools.open(current_track)

            self.player.open(audio_file)   # <---------- error
            self.player.play()
        except IndexError:
            print('playing finished')

Тогда я звоню:

tp = Trackplay(get_track_list(PATH))

где get_track_list метод, возвращающий список mp3-файлов из каталога PATH,

Ошибка, которую я получаю (в строке, отмеченной комментарием "error"):

AttributeError: Экземпляр Trackplay не имеет атрибута "player"

Я не понимаю, что происходит... но читаю все AttributeError вопросы здесь, должно быть, что-то глупо...

player мне кажется точно Trackplay атрибут. Другие атрибуты, как track_index а также track_list кажется нормально, так как линия print str(current_track) печатает текущий трек.

Спасибо за любую помощь.

1 ответ

Решение

Смотрите этот код здесь?

self.player = audiotools.player.Player(
        audio_output,
        replay_gain,
        self.next_track())

В рамках создания Player вы собираетесь назначить self.player, ты звонишь self.next_track(), self.next_track пытается использоватьself.player, до self.player существует!

def next_track(self):
    try:
        self.track_index += 1
        current_track = self.track_list[self.track_index]
        print str(current_track)
        audio_file = audiotools.open(current_track)

        self.player.open(audio_file)
        self.player.play()
    except IndexError:
        print('playing finished')

next_track даже ничего не возвращает, поэтому сбивает с толку, почему вы пытаетесь пройти self.next_track() в качестве аргумента Player,

Это должен был быть обратный звонок? Если это так, вы должны пройти self.next_track в Player не называя это.

self.player = audiotools.player.Player(
        audio_output,
        replay_gain,
        self.next_track)
#                     ^ no call parentheses
Другие вопросы по тегам