Классы
|
|
Dimon3D | Дата: Суббота, 16.05.2009, 09:00 | Сообщение # 1 |
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
| Возможно вопрос не стоит помещать в отдельный форум, но раз есть спец. тема посвященная Python то вот. Меня интересует как правильно разрушить экземпляр класса, полностью удалить его из памяти.
|
|
| |
ninth | Дата: Суббота, 16.05.2009, 09:26 | Сообщение # 2 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| del экземпляр_класса При этом, в классе должен быть метод __del__(self) в котором будет процедура очистки твоего класса, если это необходимо
|
|
| |
Dimon3D | Дата: Суббота, 16.05.2009, 09:41 | Сообщение # 3 |
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
| del пробовал, но... В общем проблема такая. Есть класс player который при нажатии кнопки генерирует экземпляры класса bullet. Экземпляр bullet должен быть разрушен при привышении расстояния до player выше допустимого. class bullet(): def __init__(self, targetNP): self.NP = NodePath('bulletNP') self.NP.reparentTo(render) self.target = targetNP ............ taskMgr.add(self.Update,'bulletTask') def Update(self,task): if self.NP.getDistance(self.target)>10: self.NP.removeNode() del self При этом удаляется только NodePath, т.к. FPS продолжает падать
|
|
| |
ninth | Дата: Суббота, 16.05.2009, 10:17 | Сообщение # 4 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| а процедура __del__ определена? В ней ты долже почистить свой буллет - в т.ч. ремувить модельки + у тебя, как я понял для каждого снаряда своя задача в таск мэнеджере? её тоже нужно удалять Объект не будет удалён пока на него есть ссылки внутри программы, а в таск мэнеджере они есть. лучше сделать массив с пулями и одну задачу которая будет проходить по массиву, а когда нужно удалять из массива и иудалять сам объект
|
|
| |
Dimon3D | Дата: Суббота, 16.05.2009, 10:22 | Сообщение # 5 |
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
| Ясно. Спасибо, я попробую.
|
|
| |
ninth | Дата: Суббота, 16.05.2009, 11:42 | Сообщение # 6 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Ещё небольшое пояснение. В питоне переменные это ссылки на объект - что-то типа ярлыков. Например, у тебя есть файло, лежащее где-нить на диске D и есть два ярлыка - на рабочем столе и в документах. При удалении ярлыков сам файл не удаляется, так же при редактировании файла, изменения будут видны вне зависимости от того с какого ярлыка ты его открыл. Так и с переменными питона - на один и тот же экземпляр класса могут ссылаться несколько переменных, при удалении с помошью del удаляется только данная конкретная ссылка, но не сам экземпляр. В питоне есть т.н. сборщик мусора, который проверяет переменные и хранит экземпляр класса до тех пор пока на него есть хоть одна ссылка. Как только ссылок не остаётся, сборщик мусора вызывает процедуру __del__ класса (если определена), а затем освобождает память.
|
|
| |
BVOG | Дата: Четверг, 12.11.2009, 17:27 | Сообщение # 7 |
Полковник
Группа: Проверенные
Сообщений: 184
Награды: 0
Репутация: 4
Статус: Offline
| del - хорошо работает, но после него следует ввести имя_класса.destroy()
Skype: thebvog
|
|
| |
Dimon3D | Дата: Воскресенье, 14.03.2010, 09:54 | Сообщение # 8 |
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
| как проверить сколько экземпляров того или иного класса в данный момент находится в памяти ?
|
|
| |
ninth | Дата: Воскресенье, 14.03.2010, 17:00 | Сообщение # 9 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Теоретически, можно обратиться к сборщику мусора за списком объектов и выяснить какие из них являются экземплярами нужного класса. Code import sys, gc num = 0 for obj in gc.get_objects(): if isinstance(obj,MyObectType): num +=1 print num Но я не уверен, что это лучший способ ибо на практике не возникало подобной необходимости, и я, если честно, слабо представляю зачем это может потребоваться.
|
|
| |