2016-03-06 63 views
0

执行文件类声明我写了一个程序,允许用户给我一个类名和定义类,像这样的文件:命名空间在运行时

input = raw_input("Input the new classname with a space and then the file name defining the class") 
    class_name, file_name = input.split(" ") 

我再执行该文件中定义的类:

execfile(file_name) 

,并尝试创建新定义的类的实例:

d[k] = eval(new_class)(**d[k]) 

然而这产生了以下错误:

d[i] = eval(new_class)(**d[i]) 
    File "<string>", line 1, in <module> 
NameError: name 'MeasureDay' is not defined 

这是我喂在已执行下面的类定义后:

class MeasureDay: 
    print("defining measureday") 
    def __init__(self, **kargs): 
     self.day = kwargs.get('day', -1) 
     self.measurement_value = kwargs('measurement_value', -1) 

    def __str__(self): 
     return "here is a custom defined string for MeasureDay" 

我知道类的定义被执行,因为我看到了记录声明“确定measureday “ 如预期的。

我在做什么错?我猜这与一些命名空间惯例有关。当我像这样定义类时,是否需要定义一个名称空间?如果是这样,我该如何去做。否则,问题是什么?

感谢您的任何建议。

+0

如果在执行后立即声明'print(locals())',它是否有任何在该文件中定义的内容? – zondo

回答

0

evalexecfile应该避免,在这里是不必要的。 importlib.import_module可以从字符串中导入模块文件,然后可以使用getattr来获取实例化的类。

class_name, file_name = input.split(" ") 
mod = import_module(file_name) 
cls = getattr(mod, class_name) 
d[k] = cls(**d[k]) 
+0

非常感谢。我想要一种没有评估的方法,但我不知道那是什么。有没有其他方法来创建动态引用类的实例的任何提示,而无需eval? – sunny