0

私はPythonの初心者であり、同様の質問がなされたと思います(これを含め、Pythonでクラスをインスタンス化するために文字列を使用できますか?)が、答えやそれらの適用方法がわかりません。

リストで「インスタンス名」と呼ぶものを使用して、クラスの複数のインスタンスを作成しようとしています。

これが私がやろうとしていることの例です:

class InstanceNames():
    def __init__(self):
        self.names = ['inst1', 'inst2', 'inst3']

class DoSomething():
    instances = []
    def __init__(self):
        DoSomething.instances.append(self)

instance_names = InstanceNames()
for x in range(len(instance_names.names)):
    print x
    # following line not working at creating instances of DoSomething
    instance_names.names[x] = DoSomething()

print DoSomething.instances

リストのforループを変更したところ、次の出力が得られました。

0
1
2
[<__main__.DoSomething instance at 0x10cedc3f8>, <__main__.DoSomething instance at 0x10cedc440>, <__main__.DoSomething instance at 0x10cedc488>]

それは機能しましたか?よくわからないので混乱しています。

Ok。これはいくつかの醜いコードですが、これが私が今持っているものです:

class InstanceNames():
    def __init__(self):
        self.i_names = {'inst1': None, 'inst2': None, 'inst3': None}
        self.o_names = ['foo', 'bar', 'baz']

class DoSomething():
    instances = []
    def __init__(self, blah_blah):
        DoSomething.instances.append(self)
        self.name = blah_blah

    def testy(self, a):
        a = a * 2

instance_names = InstanceNames()

for x in range(len(instance_names.i_names)):
    print x
    instance_names.i_names[x] = DoSomething(instance_names.o_names[x])

print "\n"

print DoSomething.instances

print "\n"

for y in DoSomething.instances:
    print y.name
    print y.testy(4)
    print "\n"

これが私の出力です:

0
1
2


[<__main__.DoSomething instance at 0x10dc6c560>, <__main__.DoSomething instance at 0x10dc6c5a8>, <__main__.DoSomething instance at 0x10dc6c5f0>]


foo
None


bar
None


baz
None

「name」バリアブル印刷が「testy」メソッドではないのはなぜですか?

4

5 に答える 5

1

instance_names.namesインデックスとして数値を必要とするリストです。実際、あなたが投稿した TypeError は同じことを言っています。

ただし、文字列を使用して要素を設定する必要がありますinstance_names.names[x]-xは文字列です。リストではこれが許可されていません。そのためには辞書を使用する必要があります。

問題を解決するには、いくつかの方法があります。

  1. そもそも instance_names.names の辞書を使用できます。Noneただし、まだ作成されていないインスタンスのプレースホルダーなどの予約済みオブジェクトを使用する必要があります, and you must iterate through the keys of the dictionary:。 x in instance_names.names.keys():`

  2. インスタンスに別の辞書を使用して、そのコンテンツをループに設定できます: self.instances = {}.instance_names.instances[x] = ...

Python のデータ型についてさらに読むには、Dive Into Pythonをお勧めします。

于 2012-08-29T06:15:44.647 に答える
1

typeクラスを動的に作成するために使用できます。

type_names = ["Class1", "Class2", "Class3"]
storage = {}
for t in type_names:
    storage[t] = type(t, (object, ), {"your": "instance", "attributes": "here"})

for type_name in storage:
    print type_name, "=>", storage[type_name]

あるいは、collections.namedtuple本当に必要なのは属性の束だけである場合は、軽量クラスを生成するために使用できます。

現在持っているのは、クラスの 3 つのインスタンスを作成し、クラスの属性DoSomethingの文字列値 (使用しない)をこれらの.InstanceNamesnamesDoSomething

于 2012-08-29T06:17:20.700 に答える
1

「文字列 'inst1' を取得して 'inst1' という変数を作成するにはどうすればよいですか」と尋ねているようです。

答えは、あなたはそれをしたくないということです。代わりに、文字列を問題のオブジェクトにマッピングする辞書またはリストを作成します。いくつかの例については、この質問を参照してください。

(それがあなたが求めているものでない場合は、質問を明確にしてください。)

于 2012-08-29T06:07:18.960 に答える
1

特定のコードに対処するために、あなたが実際に何をしようとしているのか、私にはわかりません。リストは値のコレクションにすぎません。あなたがそれをどのように扱っているかは、キーと値の間の関連付けである辞書です。

例を機能させるには、辞書を使用します。

class InstanceNames():
    def __init__(self):
        self.names = {'inst1': None, 'inst2': None, 'inst3': None}

これにより、次の式が成功するようになります。

instance_names.names[x] = DoSomething()

...names今はdictであり、キーにアクセスして値を割り当てているためです。

繰り返しますが、このコードが何をしようとしているのかわからないという免責事項を作成します...おそらく良くないと感じています...しかし、それを判断する角度はありません。

于 2012-08-29T06:07:21.203 に答える
0

とはどういう意味or xですか?

self.namesスコープに存在しませんinstance_names.names。代わりに使用してください。

于 2012-08-29T06:07:11.657 に答える