[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Общий форум » Python » Классы (Работа с классами в python)
Классы
Dimon3DДата: Суббота, 16.05.2009, 09:00 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 200
Награды: 1
Репутация: 4
Статус: Offline
Возможно вопрос не стоит помещать в отдельный форум, но раз есть спец. тема посвященная Python то вот.
Меня интересует как правильно разрушить экземпляр класса, полностью удалить его из памяти.
 
ninthДата: Суббота, 16.05.2009, 09:26 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
del экземпляр_класса
При этом, в классе должен быть метод __del__(self)
в котором будет процедура очистки твоего класса, если это необходимо
 
Dimon3DДата: Суббота, 16.05.2009, 09:41 | Сообщение # 3
Полковник
Группа: Проверенные
Сообщений: 200
Награды: 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
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
а процедура __del__ определена? В ней ты долже почистить свой буллет - в т.ч. ремувить модельки + у тебя, как я понял для каждого снаряда своя задача в таск мэнеджере? её тоже нужно удалять
Объект не будет удалён пока на него есть ссылки внутри программы, а в таск мэнеджере они есть.
лучше сделать массив с пулями и одну задачу которая будет проходить по массиву, а когда нужно удалять из массива и иудалять сам объект
 
Dimon3DДата: Суббота, 16.05.2009, 10:22 | Сообщение # 5
Полковник
Группа: Проверенные
Сообщений: 200
Награды: 1
Репутация: 4
Статус: Offline
Ясно. Спасибо, я попробую.
 
ninthДата: Суббота, 16.05.2009, 11:42 | Сообщение # 6
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 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
Полковник
Группа: Проверенные
Сообщений: 200
Награды: 1
Репутация: 4
Статус: Offline
как проверить сколько экземпляров того или иного класса в данный момент находится в памяти ?
 
ninthДата: Воскресенье, 14.03.2010, 17:00 | Сообщение # 9
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Теоретически, можно обратиться к сборщику мусора за списком объектов и выяснить какие из них являются экземплярами нужного класса.
Code
import sys, gc  
num = 0
for obj in gc.get_objects():
     if isinstance(obj,MyObectType):
         num +=1
print num

Но я не уверен, что это лучший способ ибо на практике не возникало подобной необходимости, и я, если честно, слабо представляю зачем это может потребоваться.

 
Форум Panda3D - по русски » Общий форум » Python » Классы (Работа с классами в python)
Страница 1 из 11
Поиск: