Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 27, 2011 17:32:04

dissdoc
От:
Зарегистрирован: 2009-12-12
Сообщения: 273
Репутация: +  0  -
Профиль   Отправить e-mail  

Создать новый класс по подобию старого

Итак, нашел ошибку еще одну.
Если делаю вот так

new_cls = cls()
То создается объект. Все хорошо. А если я создаю объекты в цикле, то получается параметры следующего объекта перетирают параметры предыдущего. Отсюда, нужно еще чтобы объект и клонировался.
Попробовал несколько способов.
1. B = type('B',(cls.__class__,),copy.deepcopy(cls.__dict__))
Выдает ошибку
object.__new__(dictproxy) is not safe, use dictproxy.__new__()
2. __getstate__, __setstate__ Почему-то не сработали тоже. Т.е. они отработали аналогично new_cls = cls()
3. Добавил метод copy в свой класс. Чтобы было вот так myClass().copy()
def copy(self):
_deepcopy_dispatch[ModuleType] = lambda x, module: x
result = deepcopy(self)
del _deepcopy_dispatch[ModuleType]
return result
Тоже ошибка потому. что есть вложенный класс. Неужели нужно тогда переопределять все?
'Collection' object is not callable. If you meant to call the ‘__deepcopy__’ method on a ‘Collection’ object it is failing because no such method exists.



Офлайн

#2 Ноя. 28, 2011 03:40:10

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Создать новый класс по подобию старого

> А если я создаю объекты в цикле, то получается параметры следующего объекта перетирают параметры предыдущего.
Перетирается ссылка на объект, а не сам объект. Храните их в массиве.

Опять же не понятно для чего это все.

Офлайн

#3 Ноя. 28, 2011 08:30:27

dissdoc
От:
Зарегистрирован: 2009-12-12
Сообщения: 273
Репутация: +  0  -
Профиль   Отправить e-mail  

Создать новый класс по подобию старого

Если интересно. То у меня есть класс. И я создаю запрос. Результат запроса необходимо перевести в класс. Вот и все)
Я и делаю вот так

new_cls = cls()
#.... заполняем данными, проверяем - все хорошо
mylist.append(new_cls)
И в результате в mylist все перетерлось на последний класс (точнее. все объекты перетерлись по последним данным)

Опять же если делаю вот так класс
new_cls = type(cls.__name__, (object,), dict(cls.__dict__))
То все отрабатывает, ничего не перетирается, но уже это не инициализированный класс :( Что тоже не подходит



Отредактировано (Ноя. 28, 2011 08:45:12)

Офлайн

#4 Ноя. 28, 2011 14:32:42

dissdoc
От:
Зарегистрирован: 2009-12-12
Сообщения: 273
Репутация: +  0  -
Профиль   Отправить e-mail  

Создать новый класс по подобию старого

Нашел ошибку. Код нужно оформить вот так, как мне и советовали. Я невнимательно следовал советам

new_cls = type(cls.__name__, (object,), deepcopy(dict(cls.__dict__)))
init_cls = new_cls()



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version