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定义的位置)中以字符串形式从其名称中获取对“Bar”对象的引用:

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

作为一些不请自来的建议,通常如果你这样做,最好'Bar'首先明确地放入字典,而不是需要依赖locals/ globals/ vars

于 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 回答