class Member(object):
def __init__(self, identifier):
self.identifier = identifier
print "Member __init__", self.identifier
def __del__(self):
print "Member __del__", self.identifier
with open("/home/might/" + self.identifier, "w") as outF:
outF.write(self.identifier)
class WithMembers(object):
def __init__(self):
print "WithMembers __init__"
print WithMembers.classMem
self.instanceMem = Member("instance mem")
def __del__(self):
print "WithMembers __del__"
classMem = Member("class mem")
if __name__ == "__main__":
print "main"
WithMembers()
#del WithMembers.classMem # "Member __del__ class mem" before "end"
#del WithMembers # "Member __del__ class mem" after "end"
print "end"
Приведенный выше код в Hidden.py и работает python Hidden.py
производит следующий вывод:Когда классы python и атрибуты класса собирают мусор?
Member __init__ class mem
main
WithMembers __init__
<__main__.Member object at 0x935aeec>
Member __init__ instance mem
WithMembers __del__
Member __del__ instance mem
end
Я не вижу Member __del__ class mem
на выходе или class mem
файл, если я не-комментария один из del
заявлений , Почему это? Когда собираются классы python и атрибуты класса?
Ваш код не имеет ничего общего со сбором мусора. 'del' разделяет этот идентификатор, чтобы он больше не указывал на существующий объект. Когда это происходит, вызывается 'your_object .__ del__'. Некоторое время спустя, после того, как на этот объект не осталось НИКАКИХ ССЫЛКИ, это сбор мусора. –
Возможно, никогда, и это хорошо документировано. Подумайте об использовании диспетчера контекстов. – cdarke
@cdarke: действительно хорошо документирован и, возможно, никогда не зависит от версии python. Я провел некоторое исследование и разместил http://stackoverflow.com/a/28552889/4455221 – Might