Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 30, 2011 19:54:09

valych
От:
Зарегистрирован: 2011-04-30
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматическое генерирование экземпляров класса

Добрый вечер!

Встретился с проблемой создания множества объектов класса в программе не вручную, а автоматически. Т.е., нужно, найти способ создать объект, обращаться к нему и т.д. по его сгенерированному в программе имени (типа string, как иначе - не знаю). Наверное, непонятно объясняю, но хотелось бы что-то вроде этого:

class abc:
pass

for i in xrange(10):
namestr='name'+str(i)
name=abracadabra(namestr) #волшебная функция, получающая строку и отдающая само название нового объекта, чтобы с ним можно было работать
name=abc()
name.attr=20
del name
# и т.п.
или этого:
...
for i in xrange(10):
name='name'+str(i)
abc.__createnewobject__(name)
...
и чтобы это работало со строковыми переменными (знаю что объяснил коряво, но надеюсь, что суть ясна).
Решение аналогичной проблемы, где в строковой переменной имелось имя класса, я нашел, а вот про свой случай ничего не видел.



Офлайн

#2 Апрель 30, 2011 20:32:37

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Автоматическое генерирование экземпляров класса

Что именно вы хотите сделать не очень понятно. Во многих случаях помогает способность питона выполнять строки функциями eval, exec. можно и объекты массово создать.
Может вас устроит создать dict тогда к объектам несколько сложнее обращаться но хитростей меньше

v=dict([["nm%s"%i,Ta()] for i in xrange(1000)])
el=v["nm2"]



Отредактировано (Апрель 30, 2011 20:33:09)

Офлайн

#3 Апрель 30, 2011 21:32:21

valych
От:
Зарегистрирован: 2011-04-30
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматическое генерирование экземпляров класса

doza_and
Что именно вы хотите сделать не очень понятно. Во многих случаях помогает способность питона выполнять строки функциями eval, exec. можно и объекты массово создать.
Может вас устроит создать dict тогда к объектам несколько сложнее обращаться но хитростей меньше
v=dict([["nm%s"%i,Ta()] for i in xrange(1000)])
el=v["nm2"]
Да, спасибо, то что надо! Про словари уже нашел, а вот про eval раньше не знал.

Задачей в универе поставили реализацию структуры, например стека, со всякими указателями и т.п. Делать хочу именно на питоне. Так как в питоне нет указателей и как таковой работы с динамической памятью, а использование списка как стек не прокатит, то собираюсь реализовать эти указатели вручную, классы будут примерно следующие:
...
class stack: #сам стек
head=0 #указатель на объект-вершину стека
count=0 #размер
... #тут функции добавления в стек, удаления из него, и т.д.

class object:
def __init__(self,data,next):
self.data=data #собственно, данные
self.next=next #указатель на следующий элемент
...
И при каждом stack.push(5) буду создавать экземпляр класса object с именем “name%s”%i и полем name132.data, равным 5. Может, кто-нибудь подскажет решение полаконичнее? Полный код могу привести, если нужно.



Отредактировано (Апрель 30, 2011 21:37:05)

Офлайн

#4 Апрель 30, 2011 21:47:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Автоматическое генерирование экземпляров класса

class Tli:
def __init__(self,prev,val):
self.prev=prev
self.data=val

class Tstk:
def __init__(self):
self.head=None
def push(self,el)
self.head=Tli(self.head,el)
def top(self,el)
return self.head.data
def pop(self)
if self.head:
self.head=self.head.prev
Тут надо еще подрихтовать, но вроде все получается и без генерации имен



Офлайн

#5 Апрель 30, 2011 22:38:17

valych
От:
Зарегистрирован: 2011-04-30
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматическое генерирование экземпляров класса

doza_and
class Tli:
def __init__(self,prev,val):
self.prev=prev
self.data=val

class Tstk:
def __init__(self):
self.head=None
def push(self,el):
self.head=Tli(self.head,el)
def top(self,el):
return self.head.data
def pop(self):
if self.head:
self.head=self.head.prev
Тут надо еще подрихтовать, но вроде все получается и без генерации имен
Cпасибо еще раз, то что нужно. Получилось!

Не думал, что смогу реализовать всё это без явных объявлений типа ObjName=ClassName(), поэтому и взялся за генерацию этих имен. А здесь вышло намного проще. :)



Отредактировано (Апрель 30, 2011 22:46:30)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version