有没有办法将变量设置为字符串,然后使用该变量从具有该变量名称的类调用函数?
例如:
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()
有没有办法让这项工作?
答案 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()