2016-12-31 1 views
1

Я пытаюсь реализовать проект с использованием class inheritance, где родительский класс:Python класса - наследование атрибутов

class radio: 

    def __init__(self, artist=None, track=None, genre=None): 

     self.artist = artist 
     self.track = track 
     self.genre = genre 

Затем я создаю methods для каждого attribute (не рабочих примеров):

def seed_artist(self): 
     results = api.search(q=self.artist, type='artist') 
     return results 

    def seed_track(self): 
     results = api.search(q=self.track, type='track') 
     return results 

    def seed_genre(self): 
     results = api.search(q=self.genre, type='genre') 
     return results 

пользователь будет выбирать семя выше (только одно), будь то artist, track, genre или mood, и именно поэтому я инициализирую все аргументы с помощью None, оставляя значение аргумента для ввода на уровне наследования.

унаследованный class является:

class playlist(radio): 

    def __init__(self,user): 
     radio.__init__(self, artist, track, genre) 

позволяет говорить о данных, вводимых пользователем на командной строке track seed, и мой сценарий заканчивается, начиная с глобальной переменной:

track = 'karma police' 

Таким образом, все другие атрибуты (artist, genre) есть None.

когда я создаю экземпляр, скажем:

jeff = playlist('Jeff Smith') 

Он выдаст ошибку о том, что genre и artist не определены, и я бы наследовать только track атрибут, например, так:

radio.__init__(self, track) 

Я знаю, что я мог запустить сценарий с глобальными переменными определено:

track = None 
genre = None 
artist = None 

и это позволило бы мне иметь:

radio.__init__(self, artist, track, genre) 

, но это кажется мне довольно резервированной ...

Есть обходной путь это, без необходимости начальных значений глобальных переменных набора в None , сохраняя весь код в определениях класса?

+0

Я дал ответ ниже, но это трудно сказать, что альтернатива для глобальных переменных, потому что вы не показали или даже описал, как ваш код получает от пользователя ввод для создания глобальной переменной, называемой 'tracks'. Одна из возможностей заключается в том, чтобы «playlist» также принимал «track», «artist» и т. Д., И ваш код анализа ввода передавал ему запрос таким же образом, как я описал в своем ответе. – BrenBarn

+0

@BrenBarn Я отредактировал вопрос для вас, если вы захотите отредактировать свой ответ. –

ответ

1

Вместо использования отдельной глобальной переменной для каждого поля используйте один словарь для всех полей. Затем вы можете передать словарь как аргументы ключевого слова.

То есть вместо создания глобальной переменной, называемой artist, создайте словарь под названием radio_fields или что-то в этом роде. Когда пользователь вводит свой запрос, установите ключ на этом Словаре:

radio_fields = {} 
... 
# when you get the user's command 
radio_fields['track'] = 'Karma Police' 

Теперь вы можете позвонить radio.__init__(self, **radio_fields). Это будет передано в качестве аргументов, какие ключи находятся в radio_fields. Если есть только один, только тот будет передан, а остальные будут принимать значения по умолчанию, как вы определили их, когда вы определили radio.__init__.

Возможно, лучший способ структурировать вашу общую программу, но трудно сказать, основываясь на том, что вы показали здесь.Например, непонятно, почему playlist принимает только один аргумент user. Если playlist принял все полевые аргументы, которые принял radio, он может передать их на radio без проблем.

0

У вас нет этих переменных для передачи, поэтому не пытайтесь их передавать. Родительский класс уже имеет значения по умолчанию для них, так что просто пройти тот, который вам нужен:

radio.__init__(self, artist=artist) 
+0

Проблема заключается в том, что он должен будет написать кучу отдельных вызовов в зависимости от того, какие переменные определены, а также путаница операторов 'if', чтобы решить, какой вызов использовать. – BrenBarn

+0

, но я не знаю тот, который мне нужен ... Это звонок пользователя. –