从列表创建类实例

时间:2009-08-28 13:28:35

标签: python

使用python .....我有一个包含名称的列表。我想使用列表中的每个项来创建类的实例。我不能在当前条件下使用这些项目(它们是字符串)。有谁知道如何在循环中这样做。

class trap(movevariables):
    def __init__(self):
        movevariables.__init__(self)
        if self.X==0:
            self.X=input('Move Distance(mm) ')
        if self.Vmax==0:
            self.Vmax=input('Max Velocity? (mm/s)  ')
        if self.A==0:
            percentg=input('Acceleration as decimal percent of g'  )
            self.A=percentg*9806.65
        self.Xmin=((self.Vmax**2)/(2*self.A))
        self.calc()
    def calc(self):
        if (self.X/2)>self.Xmin:
            self.ta=2*((self.Vmax)/self.A)                # to reach maximum velocity, the move is a symetrical trapezoid and the (acceleration time*2) is used
            self.halfta=self.ta/2.                               # to calculate the total amount of time consumed by acceleration and deceleration
            self.xa=.5*self.A*(self.halfta)**2
        else:                                                               # If the move is not a trap, MaxV is not reached and the acceleration time is set to zero for subsequent calculations                                                        
            self.ta=0
        if (self.X/2)<self.Xmin:
            self.tva=(self.X/self.A)**.5
            self.halftva=self.tva/2
            self.Vtriang=self.A*self.halftva
        else:
            self.tva=0
        if (self.X/2)>self.Xmin:
            self.tvc=(self.X-2*self.Xmin)/(self.Vmax)  # calculate the Constant velocity time if you DO get to it
        else:
            self.tvc=0
        self.t=(self.ta+self.tva+self.tvc)
        print self

我是一名机械工程师。陷阱类描述了在我们的机器设计中常见的运动曲线。我们的设备中有许多独立的轴(陷阱类),因此我需要通过创建唯一的实例来区分它们。 trap类继承自movevariables许多getter / setter函数结构化为属性。通过这种方式,我可以使用实例名称编辑变量。我想我可以通过遍历列表而不是输入每个机器轴来一次初始化许多机器轴。

5 个答案:

答案 0 :(得分:2)

您可以使用dict,例如:

classes = {"foo" : foo, "bar" : bar}

然后你可以这样做:

myvar = classes[somestring]()

这样你就必须初始化并保留dict,但是可以控制可以创建哪些类。

答案 1 :(得分:2)

getattr方法看似正确,更详细一点:

def forname(modname, classname):
    ''' Returns a class of "classname" from module "modname". '''
    module = __import__(modname)
    classobj = getattr(module, classname)
    return classobj

来自a blog post by Ben Snider

答案 2 :(得分:1)

如果是字符串形式的类列表,您可以:

classes = ['foo', 'bar']
for class in classes:
    obj = eval(class)

并创建一个实例,您只需执行此操作:

instance = obj(arg1, arg2, arg3)

答案 3 :(得分:1)

修改

如果要创建类陷阱的多个实例,请执行以下操作:

namelist=['lane1', 'lane2']
traps = dict((name, trap()) for name in namelist)

这将创建一个将每个名称映射到实例的字典。

然后按名称访问每个实例:

traps['lane1'].Vmax

答案 4 :(得分:0)

你可能正在寻找getattr