1

Pythonに、クラスインスタンスの作成に変数値を使用できる方法はありますか?

class Test(object):
    def __init__(self, object):
        self.name = object
        print "Created Object :",self.name

a1 = Test('a1')
print a1.name
b2 = 'a2'
b2 = Test(b2)
print a2.name

この例では、クラスインスタンス名をそれぞれ「a1」と「a2」にする必要があります。値'a2'は他のプロセスから計算されるため、直接使用することはできませんが、アクセスできるように、クラスインスタンス名はそれに一致する必要があります。

上記の例では、エラーが発生します:

 Created Object : a1
 a1
 Created Object : a2

 Traceback (most recent call last):
 File "D:\a\h", line 12, in <module>
 print a2.name
 NameError: name 'a2' is not defined
4

3 に答える 3

4

変数名を動的に作成したいときはいつでも、立ち止まって、辞書がより良い方法であると自分に言い聞かせる必要があります。クラスインスタンスをどこでも利用できるようにしたい場合(これも最善のアイデアではありません)、これを行う方法は次のとおりです。

class Test(object):
    instance_dict={}
    def __init__(self,name):
        self.name=name
        self.instance_dict[name] = self

これで、このクラスを使用できます。

a1 = Test("a1")
print a1 is Test.instance_dict["a1"] #True
b1 = Test("a2")
print b1 is Test.instance_dict["a2"] #True

つまり、instance_dictclass属性は、特定の名前で最後に作成されたインスタンスのハンドルを保持するため、使用可能な場所であればどこでもインスタンスのハンドルを保持Testできます。

ただし、このタイプのデザインはお勧めしません。ここでの欠点は、グローバル変数を使用する場合の欠点と同じです。プログラムを介したデータの流れが適切に順序付けられていないという理由だけで、保守が困難になったり、何が起こっているのかを正確に把握したりするのが難しくなる可能性があります。

于 2012-08-02T13:05:40.853 に答える
3

探しているものに最も近いのは、すべてのインスタンスを辞書に保存することです。

class Test(object):
    def __init__(self, n):
        self.name = n
        print "Created Object :",self.name

d = {}
d['a1'] = Test('a1')
print d['a1'].name
b2 = 'a2'
d[b2] = Test(b2)
print d['a2'].name

オブジェクトを参照する変数の名前とオブジェクト自体の間に関係はありません。

于 2012-08-02T13:19:48.393 に答える
1

print b2.name代わりに試してください。

注:この名前nameは、Pythonに特別な意味を持つものではありません。「クラスに名前を付ける」はPythonにとって何の意味もありません。それは、あなたが書いたコードを実行するだけです。「クラスに名前を付ける」とは、あなたにとって何かを意味しますが、Pythonはあなたの心を読み取ることができず、読み取ることもできません:-)

したがって、によって参照されるインスタンスの名前をに設定しても、魔法のように参照が作成されるb2ことa2はありませんa2

この変数名の紹介は役立つかもしれません:Pythonを使用したプログラミングの学習:変数と識別子

一言で言えば、あなたが書くなら

a = 'x'

Python

  1. 文字列インスタンスを作成します
  2. xその文字列インスタンス(テキスト)に値を割り当てます
  3. この新しい文字列インスタンスへの参照をエイリアスに割り当てますa

次に書く場合:

b = a

メモリにはまだ1つの文字列インスタンスしかありません。bと同じ文字列インスタンスを参照する2番目のエイリアスのみを作成しましたa

于 2012-08-02T13:05:59.937 に答える