将变量设置为类的名称并从该类调用函数

时间:2013-04-18 20:33:00

标签: python

有没有办法将变量设置为字符串,然后使用该变量从具有该变量名称的类调用函数?

例如:

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()

有没有办法让这项工作?

3 个答案:

答案 0 :(得分:3)

您可以从locals(或globals返回的映射中的字符串)中获取对“Bar”对象的引用,具体取决于Bar的定义位置:< / p>

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

作为一些未经请求的建议,通常如果您这样做,最好先将'Bar'明确地放入字典中,而不是依赖locals / {{1 }} / globals

答案 1 :(得分:1)

不是将对象放入单个变量中,而是将它们放入dict中:

chooser = {'c00': c00(), 'c01': c01()}
chooser['c' + xstr + ystr].printname()

答案 2 :(得分: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()