2017-11-22 7 views
-6

は、だから私は、このクラスに持ってリストの要素をクラスのオブジェクトとして使用するにはどうすればよいですか?

class Character(object): 
    def __init__(self): 
     self.NAME = '' 
     self.life = 50 
私もこのリスト

players = ["red","green","blue","yellow"] 
を持って

私は文字をそれぞれ「プレイヤー」を作るになることをしようとしていると、これは私がやったことある

for player in players: 
    player = Character() 

今私が行くとき

print(red.life) #or if i try 
print("red".life) #why doesn't it work? 
# for some reason it uses player as object for the 
# class but I want the element of the list to be used!  
+0

'print(" red ".life)'とは何でしょうか? –

+0

[変数名として文字列変数を使用する]の可能な複製(https://stackoverflow.com/questions/11553721/using-a-string-variable-as-a-variable-name) –

+2

各要素を渡す必要があります'__init__'への引数としてリストの'文字列 '' red ''は' 'Character'のインスタンスではありません。プレイヤー= [赤色、緑色、青色、黄色]の色の文字(色)。 – chepner

答えて

3

これは、辞書に選手を置くことによって動作します:

class Character(object): 
    def __init__(self): 
     self.NAME = '' 
     self.life = 50 

players = ["red","green","blue","yellow"] 
dict_players = {} 

for player in players: 
    dict_players[player] = Character() 

あなたのクラスの__str__メソッドを作成する場合は、印刷のみ動作します。

1

文字列のリストがあり、"red".lifeは、文字列オブジェクトに含まれていないメンバ変数lifeを呼び出しようとしています。あなたがlifeを呼び出すことができ、その後

class Character(object): 
    def __init__(self): 
     self.NAME = '' 
     self.life = 50 

red = Character() 
green = Character() 
... 

print(red.life) 
+0

プレイしているプレイヤーが何人いるかわからないので、プレイリストには誰もプレイしていない場合、私はリストから彼を削除できます。 –

1

この:

for player in players: 
    player = Character() 

playersの各項目のための新しいCharacterインスタンスを作成します(ない代わりに、別のクラスのインスタンスを作成しますその項目自体を使用して)変数にplayerを代入します(前回の代入をovverriddingするたびに)。もちろんこれはあなたのplayersリストに何も変更されません。ループが終了すると、Character()インスタンスがplayerという変数に束縛されてしまいます。ループを単一のものに置き換えるのと同じ実用的な結果が得られるでしょう:

player = Character() 

しかし、明らかに使用されるものではありません。あなたはredという名前の変数を定義した

プリント(red.life)

または私は プリント( "赤" .life)

"red"が文字列であるとしよう。文字列には属性がありませんlife

何らかの理由で クラスのオブジェクトとしてplayerを使用していますが、リストの要素を使用したいと思います!

"リストの要素"(私はあなたがplayersリストを意味すると仮定します)も文字列です。あなたの代わりにCharacterインスタンスのリストを取得したい場合、あなたはどのようなことにそれを得ることができます。

class Character(object): 
    def __init__(self, name): 
     self.name = name 
     self.life = 50 

playernames = ["red", "green", "blue", "42"] 
players = [Character(name) for name in playernames] 

が、それはまだ、など​​、文字インスタンスのリストだけをredという名前の変数を作成しません。

特定の文字インスタンスを取得できるようにするには、明示的に変数を作成するか、または辞書を使用する必要があります。作成変数:

red = Character("red") 
yellow = Character("yellow") 
# etc 

が、これは、すべての文字がハードコードされていること - あなたは、多かれ少なかれプレーヤーを持っていたり、これらを別の名前を付けることができないなど

の辞書を使用する:

playernames = ["red", "green", "blue", "42"] 
players = {name:Character(name) for name in playernames} 

print(players["red"].life) 
print(players["green"].life) 
# etc 
+0

文字列を「すぐに変数にする」方法はありませんか?私はeval(player)= Character()を使って試してみたのはなぜですか? –

+0

evalはそのようには機能しません。しかし、もしあなたがあらかじめ知っていなければ、あなたがdictを使用しているプレーヤーの数が唯一の純粋な解です。どんな変数が他に定義されているか、どのように知っていますか? –

0

みんなありがとう、私はすべてのあなたの答えを理解しようとし、それを動作させました、それは私が作ろうとしているゲームのためであり、それは私のコーディングが混乱であり、それは0の可読性を持っています。今のところ私はこのキャラクタークリエイターと世界地図作成者を作っただけで、地図はさまざまなタイルでできています(ショップ、川、ジャングルのような名前)、それぞれの名前は特別な特性を持っています。私はキャラクターが生まれて動き回ることを可能にしました。そして、私は今、どのタイプのタイルがキャラクターであるかを知る何かを作ります。悲しいことに、すべてのタイルに異なる座標を与える方法を考え出すのは苦労しています。 私は非常に感謝しています。

関連する問題