2017-07-07 4 views
1

私は学校プロジェクト用のプログラムを作っています。それはモデル国連です。リストからクラスインスタンスを作成するにはPython

countries = ['Australia', 'Brazil', 'Canada'] 

class delegate(object): 
    def __init__(self, country): 
    self.country = country 

私は、委任者と呼ばれる国とクラスのリストを持っています。したがって、各デリゲートオブジェクトには国が必要です。通常は次のようにします:

mexico = delegate('Mexico') 

これはそうです。しかし、私は国リストをループし、それぞれのクラスインスタンスを作成したいと思います。つまり、

australia = delegate('Australia') 
brazil = delegate('Brazil') 
canada = delegate('Canada') 

などです。 どうすればいいですか? ありがとうございます!

+0

私はあなたに役立つ回答の選択肢を再評価することをお勧めします。または、少なくともその答えがあなたが探しているものを達成するのに役立った理由を説明してください。現在のところ、あなたが探しているものが正確にヒットしています(https://stackoverflow.com/a/44981035/1832539)。 – idjaw

+0

@idjawこんにちは、私はPython(プログラミングも)の新機能です。あなたが指定した答えを試しましたが、エラーが表示されました。私は理由を知らなかったが、あなたが私を説明することができれば、私は自分の選択を変えてうれしい。実際、私は持っていた。 このエラーは次のとおりです。 代理人= {国:国の国の代理人(国)} ^ SyntaxError:無効な構文 –

+0

コードを貼り付けてコピーするだけで、構文エラーは発生しませんでした。コードをコピーして、それを新しいPythonファイルに貼り付けて、もう一度やり直してみてください。 – idjaw

答えて

8

通常、リストから名前付き変数を作成するのは悪い考えです。たぶん、あなたは

countries = ['Australia', 'Brazil', 'Canada'] 

class Delegate(object): # according to PEP8, class names should be title-case 
    def __init__(self, country): 
     self.country = country 

# create a dict 
delegates = {country: Delegate(country) for country in countries} 

編集を試みることができる:@SethMMortonあたりとしてを、Pythonの2.6は(つまり、私が上記使用したもの)を辞書内包表記を理解していません。

delegates = dict([(country, Delegate(country)) for country in countries]) 
+2

nit:py3 not note *オブジェクトから明示的に継承する必要はありません。 - > 'class Delegate:'で十分です。 – idjaw

+0

私はdictを理解していないので、プログラムに書き込むときに構文エラーが表示されます。 代理人= {国:国の国の代理人(国)} ^ SyntaxError:無効な構文 –

+0

@ Arturo.MartどのPythonバージョンを使用していますか?これはPython 3.5.3で私にとって完璧に動作します。 –

1
[delegate(c) for c in countries] 
-3

私はあなたが匿名のクラスと呼ばれるものを探していると信じています。これは、変数に代入することなくクラスを作成していることを意味します。例:

country_delegates = [] 
for country in countries: 
    country_delegates.append(delegate(country)) 

これにより、国ごとに1つの委任オブジェクトのリストが作成されます。特定の国に所属するデリゲートを取得する場合は、そのリストを検索して正しい国のデリゲートオブジェクトを返す関数を作成できます。

+1

あなたはここで匿名のクラスを作っているわけではありません。あなたはどんな授業もしていない*。私はあなたが "匿名クラス"を作成するために 'type'コンストラクタを拷問することができると思いますが、実際にはそうではありません... –

+0

これは、将来の読者に非常に誤解を招くガイダンスを提供することになります非常に残念です。 – idjaw

+0

詳しいことはありますか? 'delegate'というクラスがあれば、このコードは正常に動作します。私は、匿名クラスは変数に代入されることなくインスタンス化されたクラスだと思っていましたが、そうではありませんか? – KAL

-1

あなたは、exec使用することができます。

countries=['australia','brazil','canada'] 
for country in countries: 
    exec('%s=delegate(%s.capitalize())'%(country,country)) 

これは、デリゲートの新しいインスタンスを作成し、それは、その適切な国名に割り当てられます。お役に立てれば。

+0

これは安全ではありません – saarrrr

+1

'countries.append(" rm -rf /; abc ")'はい、Python自体ではありませんが、あなたはそのアイデアを得ます。 'exec'は一般的に避けなければなりません。 –

+0

@HughBothwell tr​​ue、これは有効な解決策です –

関連する問題