2017-12-23 3 views
-2

lyrics_bdayに属性の歌詞を設定するとコードが正常に機能し、lyric_bullsまたはlyrics_tamashaの場合はNameErrorが返されます。どうしてこんなことに?NameErrorのあいまいさ:

class Song(object): 
def __init__(self, lyrics): 
    #self.lyrics is the instance while lyrics is the attribute 
    self.lyrics = lyrics_bday 

def sing_me_a_song(self): 
    for line in self.lyrics: 
     print line 

lyrics_bday = ["\n Happy Birthday to you", "\n I dont want to get sued", "\n So I'll stop here"] 
happy_bday = Song(lyrics_bday) #passing the variable to class 

lyrics_bulls = ["\n They rally around the family", "\n With pockets full of shells"] 
bulls_on_parade = Song(lyrics_bulls) 

lyrics_tamasha = ["\n Pal bhar sambhal jao", "\ndil ko kaise samjhaun", "\nAgar tum sath ho"] 
agar_tum_sath_ho = Song(lyrics_tamasha) 

happy_bday.sing_me_a_song() 

bulls_on_parade.sing_me_a_song() 
+1

「__init__」は、それを使用しない場合、なぜ「歌詞」引数を取るのですか? –

+0

'__init__'に' self.lyrics = lyrics'を使用してください – Gahan

+0

ハッピーバースデーはパブリックドメインになりました。あなたはもう訴えられません。 – Barmar

答えて

0

ないあなたが__init__で何をしたいのかわからなく、今のようにコードは歌詞のみに割り当てる値が含まれています。 __init__lyrics_bdayself.lyricsを割り当てていて、引数をlyricsとしていますので、self.lyrics = lyrics を使用する必要がありますが、関数を呼び出す場合は引数を渡すのはなぜですか?コード例以下を参照してください。

class Song(object): 
    def __init__(self, **kwargs): 
     # ... include your desire code here 
     self.default_lyrics = ["*-"*10,"DEMO","lyrics..........","*-"*10] 

    def sing_me_a_song(self, lyrics=None): 
     if not lyrics: 
      lyrics = self.default_lyrics 
     for line in lyrics: 
      print(line) 

song_object = Song() 
lyrics_bday = ["\n Happy Birthday to you", "\n I dont want to get sued", "\n So I'll stop here"] 
lyrics_bulls = ["\n They rally around the family", "\n With pockets full of shells"] 
lyrics_tamasha = ["\n Pal bhar sambhal jao", "\ndil ko kaise samjhaun", "\nAgar tum sath ho"] 

song_object.sing_me_a_song(lyrics_bday) 
song_object.sing_me_a_song(lyrics_bulls) 
song_object.sing_me_a_song() 

出力:

Happy Birthday to you 

I dont want to get sued 

So I'll stop here 

They rally around the family 

With pockets full of shells 
*-*-*-*-*-*-*-*-*-*- 
DEMO 
lyrics.......... 
*-*-*-*-*-*-*-*-*-*- 

あなたはクラスオブジェクトごとに作成する必要はありません見ることができるように。それが必要なときに引数を渡すだけで、__init__を考えれば、歌詞が機能するために渡されなければ、印刷されるべき歌詞の定義済みの値を使うことができます。

関連する問題