понедельник, 12 января 2009 г.

Python object

Начало здесь: http://blog.axet.ru/2008/02/object-languages.html

Пожалуй самой большой ошибкой в стандарте python есть отсутствие деструкторов.

Создатели языка поторопились и поместили в язык все преимущества и отказались от всех недостатков C++, заисключением понятия самоочистки.

Идея деструктора в С++ - производить очистку объекта. Дополнительно к этому комплилятор снабжает код, дополнительными проверками и деструкторами локальных объектов.

В питоне я хотел бы видеть возможность принудительно очистить объект, в случае если объект был очищен и на него остались ссылки вызывается исключение. Эта логическая схема отлично зарекомендовала себя в языке С++. С той только разницей что это не выдилялось как самостоятельное направление и содеража потенциальные проблемы защиты.

Например, когда вы создаете объект в С++, у него вызывается функция инициализатор, которая подготавливает объект к использованию. Когда вы заканчиваете работать с объектом, вы вызываете delete *pointer. Она освобождает память, очищает локальные переменные и вызывает их дестркуторы. После чего объект удаляется. Однако, если не смотня на то что вы удалили объект, вы продолжаете с ним работать - вызывается исключения защиты памяти или что нибудь другое.

Выходит что в С++ разработана одна из самых лучших моделей работы с объектами, содержащая небольшие проблемы и понтенциальные проблемы вызывающие недостаток по защите среды исполнения и кучи памяти. В питоне же наоборот.

В питоне вы получаете обсолютную защиту по памяти, но получаете куда более страшные ошибки по утечкам памяти и не линейности работы и временем жизни объектов.

Теперь я продемонстрирую наглядно мои слова:

C++

class My
{
   Some m_some;

  public:
   My(){}
   ~My(){};
};

{
  My *m =  new My();
  delete m;
}

Вы легко создате объект и компилятор помогает вам удалить его, среда исполнения следит за тем чтобы объект не использовался повторно. Разумеется было бы правильей и надежей делать это через использование счетчика ссылок на объект (refcount). Но такая модель была бы менее эффективной и мнее производительной. Главное здесь - вы получаете полное понимание и контрольза жизнью объекта и система помогает вам избежать ошибок, правдо ценой стабильности.


Возмем питон.

class Data:
  some = None

  def __init__(self):
    None

  def __del__(self):
    None

  def close(self):
    None

Если вы работаете с объектом и захотели его удалить, вы не можете быть увереным, что объект не испльзуется!

self.data = {}
self.data[obj] = Data()

self.data[obj].close()
del self.data[obj]

Для реализации надежного удаления вы должны сделать работу за компилятор:
- вызвать метод очистки
- проследить что все локальные переменные удалены
- проследить за тем что все глобальные ссылки на объект удалены.

И все равно вы не получаете полной гарантий в том, что объект удален!

В добавок к этому, вы приобретаете привычку писать кучу ненужного кода по инициализации и очистки объектов, создате дополнительные проверки, дублирующий код, и очистку.

Куда было бы приятней такая конструкция:


self.data = {}
self.data[obj] = Data()

superdel self.data[obj]

В которой superdel - вызывает деструктур именуемый __superdel__ у класса, после чего удаляет объект из массива и проверяет (!) количство ссылок на объект. В случае если фукнция деструктора класса __superdel__ не смогла очистить объект от локальных или глобальных ссылок superdel вызывает исключение!

И это все, что отделяет питон от самого гибкого и удобного инструмента разработки!

1 коммент.:

  1. АнонимныйJun 30, 2010 04:14 AM
    Бред какой-то а не примеры.
    Причем тут такая польза мне не понятно. Польза от деструкторов не в том что можно вызвать delete а в том что этот delete за тебя вызовет компилятор когда закончится область видимости.
    ОтветитьУдалить