создание экземпляров классов из списка - PullRequest
2 голосов
/ 28 августа 2009

Использование 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 наследует от переменных перемещения многие функции получения / установки, структурированные как свойства. Таким образом, я могу редактировать переменные, используя имена экземпляров. Я думаю, что могу инициализировать сразу несколько осей станка, просматривая список вместо того, чтобы набирать каждую из них.

Ответы [ 5 ]

2 голосов
/ 28 августа 2009

Вы можете использовать диктовку, например:

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

тогда вы могли бы сделать:

myvar = classes[somestring]()

таким образом, вам придется инициализировать и сохранять диктовку, но вы сможете контролировать, какие классы можно создавать.

2 голосов
/ 28 августа 2009

Подход getattr кажется правильным, немного более детальным:

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

Из сообщения в блоге Бена Снайдера .

1 голос
/ 28 августа 2009

EDIT

Если вы хотите создать несколько экземпляров класса trap, вот что нужно сделать:

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

Это создаст словарь, который сопоставит каждое имя с экземпляром.

Затем для доступа к каждому экземпляру по имени вы делаете:

traps['lane1'].Vmax
1 голос
/ 28 августа 2009

Если это список классов в строковой форме, вы можете:

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

и для создания экземпляра вы просто делаете это:

instance = obj(arg1, arg2, arg3)
0 голосов
/ 28 августа 2009

вы, вероятно, ищете getattr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...