2016-12-31 165 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 

用戶將選擇一個以上的種子(只有一個),它是artisttrack,genremood,這就是爲什麼我初始化所有參數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') 

它會拋出一個錯誤,說genreartist沒有定義,我將不得不只繼承track屬性,就像這樣:

radio.__init__(self, track) 

我知道我可以用定義的全局變量來啓動腳本:

track = None 
genre = None 
artist = None 

,這將讓我有:

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

但這似乎對我相當多餘的......

有一種解決方法,既沒有必要的全局變量的初始值設置爲None ,將所有的代碼保存在類範圍定義中?

+0

我給了以下的答案,但很難說什麼了全局變量的另一種方法是,因爲你沒有顯示或甚至描述了你的代碼如何從用戶輸入到創建一個名爲'tracks'的全局變量。一種可能性是讓「播放列表」也接受「軌道」,「藝術家」等,並讓你的輸入解析代碼以類似於我在答案中所描述的方式傳遞一個字典。 – 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

但我不知道我需要的那個......這是用戶的呼叫。 –