1

変数を文字列に設定し、その変数を使用して、その変数と同じ名前のクラスから関数を呼び出す方法はありますか?

例えば:

class Foo(object):
    def printer(self):
        print "Hello."

Bar = Foo()
var = 'Bar'

次に、var.printer() を呼び出そうとすると、エラーが発生します。

AttributeError: 'str' object has no attribute 'printer'

これは理にかなっていますが、クラスと同じ名前の変数を使用して、その方法でクラス関数を呼び出す方法はありますか?

これを行う理由は、個々の変数のセットを持ち、それらの変数を調整し、それらを文字列に結合して、文字列と同じ名前のクラスから関数を呼び出すことができるようにするためです。例えば:

from random import randint    

x = 0
y = 0

class c00(object):
    def printname(self):
        print "c00"

class c01(object):
    def printname(self):
        print "c01"

choose_class = randint(0, 2)

if choose_class == 0:
    xstr = str(x)
    ystr = str(y)
    string = 'c' + xstr + ystr
    string.printname()

else:
    y += 1
    xstr = str(x)
    ystr = str(y)
    string = 'c' + xstr + ystr
    string.printname()

これを機能させる方法はありますか?

4

3 に答える 3

2

「バー」オブジェクトへの参照を、その名前からlocals(またはが定義さglobalsれている場所に応じて) 返されるマッピングから文字列として取得できます。Bar

locals()['Bar'].printer()

ちょっとした一方的なアドバイスとして、通常、これを行う場合は、 // に依存する必要があるのではなく、最初に明示的に辞書に入れることをお勧め'Bar'します。localsglobalsvars

于 2013-04-18T20:34:31.273 に答える
0

オブジェクトを個々の変数に入れる代わりに、辞書に入れます。

chooser = {'c00': c00(), 'c01': c01()}
chooser['c' + xstr + ystr].printname()
于 2013-04-18T20:37:34.483 に答える
0

私があなたの問題をよく理解していれば、それを行う必要はありませんrandom.choice。代わりに リストを使用してください。

class c00(object):
    def printname(self):
        print "c00" 

class c01(object):
    def printname(self):
        print "c01" 

classes = [c01, c00]

my_var = random.choice(classes)()
my_var.printname()
于 2013-04-18T20:38:37.873 に答える