Tag: деструктор

del MyClass не вызывает объект .__ del __ ()

У меня есть класс, который открывает файл для записи. В моем деструкторе я вызываю функцию, которая закрывает файл: class MyClass: def __del__(self): self.close() def close(self): if self.__fileHandle__ is not None: self.__fileHandle__.close() но когда я удаляю объект с кодом вроде: myobj = MyClass() myobj.open() del myobj если я попытаюсь восстановить объект, я получаю ошибку значения: ValueError: […]

Почему Python уничтожает переменные класса перед объектами?

Я понимаю, что Python не гарантирует порядок уничтожения объектов в конце программы, или даже это произойдет. Поэтому я понимаю, что деструктор класса не может полагаться на глобальные переменные, включая другие модули. Но я бы подумал, что объекты класса должны быть уничтожены до того, как класс будет уничтожен. Очевидно нет: class A(object): count = 0 def […]

Является ли использование __del __ () для очистки в python ненадежным?

Я читал о различных способах очистки объектов в Python, и я наткнулся на эти вопросы ( 1 , 2 ), которые в основном говорят, что очистка с использованием __del__() ненадежна и следует избегать следующего кода: def __init__(self): rc.open() def __del__(self): rc.close() Проблема в том, что я использую именно этот код, и я не могу воспроизвести […]

В python 2.x я должен вызвать объект .__ del__?

В Python 3.x все классы являются подклассами object . В 2.x вам нужно явно указать class MyClass(object) . И, поскольку я пытаюсь написать как можно больше кода совместимости с 3.x, я являюсь object подкласса. В моей программе я использую метод __del__ , и я хотел знать, должен ли я называть object.__del__(self) , или если это […]

Могут ли обратные вызовы `weakref` заменять` __del__`?

Есть ли препятствие, которое препятствует тому, чтобы weakref выполнял все, что __del__ делает, но с гораздо более сильными гарантиями (например, finalize гарантии того, что вызов будет сделан до выхода переводчика, а порядок вызовов будет определен и т. Д.)? Похоже, что в далеком прошлом считалось, что weakref в конечном итоге приведет к удалению __del__ с языка. […]

Варианты использования для __del__

Каковы варианты использования в python 3 написания пользовательского метода __del__ или использования одного из stdlib 1 ? То есть, в каком сценарии это разумно безопасно, и может сделать что-то, что трудно сделать без него? По многим причинам ( 1 2 3 4 5 6 ) обычно рекомендуется избегать __del__ и вместо этого использовать контекстные менеджеры […]

Я не могу заставить __dealloc__ вызываться при удалении объекта

У меня есть следующий класс C ++: .ЧАС class ALabSet: public LabSet { public: PyObject *m_obj; ALabSet(PyObject *obj); virtual ~ALabSet(); PyObject *GetPyObj(); }; .CPP ALabSet::ALabSet(PyObject *obj): LabSet() { this->m_obj = obj; // Provided by "cyelp_api.h" if (import_cyelp()) { } else { Py_XINCREF(this->m_obj); } } ALabSet::~ALabSet() { Py_XDECREF(this->m_obj); } PyObject *ALabSet::GetPyObj() { return this->m_obj; } Я […]

Почему на выходе переводчика не могут быть вызваны деструкторы?

Из документов python : Не гарантируется, что __del__() вызываются для объектов, которые все еще существуют, когда переводчик завершает работу. Почему нет? Какие проблемы возникнут, если эта гарантия будет выполнена?

Как принудительно удалить объект python?

Мне интересно узнать о __del__ в python, когда и почему его следует использовать и для чего его не следует использовать. Я усердно изучил, что на самом деле это не совсем то, что наивно ожидалось от деструктора, поскольку это не противоположность __new__ / __init__ . class Foo(object): def __init__(self): self.bar = None def open(self): if self.bar […]

Как правильно очистить объект Python?

class Package: def __init__(self): self.files = [] # … def __del__(self): for file in self.files: os.unlink(file) __del__(self) выше завершается с ошибкой AttributeError. Я понимаю, что Python не гарантирует существование «глобальных переменных» (данные члена в этом контексте?) При __del__() . Если это так, и это причина исключения, как я могу убедиться, что объект деструктурирует правильно?

Python - лучший язык программирования в мире.