2017-01-12 10 views
1

protobuf генерирует классы C++/Java, и это статический типизированный класс, достаточный для кодирования/декодирования. Почему он генерирует классы python с атрибутом metaclass: Я бы предположил, что обычного класса будет достаточно, чтобы делать rpc, например, классы с C++/Java.Почему protobuf генерирует класс python с атрибутом __metaclass__?

Почему python должен использовать динамический класс? Спасибо.

ответ

3

В основном, потому что его легче читать.

Генераторы кода для C++ и Java действительно трудно понять и отредактировать, потому что вы должны одновременно выполнять как код генератора, так и код, создаваемый одновременно.

Возможно, генератор кода Python был выполнен таким же образом. Однако, поскольку Python является динамическим языком, вместо него можно использовать метаклассы. По сути, это позволяет создать большую часть кода во время выполнения. Метакласса намного проще читать и редактировать, чем генератор кода, потому что это все прямой Python, без уродливых операторов печати.

Теперь вы можете утверждать, что Java могла бы сделать что-то похожее: сгенерируйте очень простые классы, а затем используйте отражение для чтения и записи полей. Проблема заключается в том, что Java является скомпилированным языком. Скомпилированный код будет работать намного лучше, чем код на основе отражения. Python, однако, не скомпилирован, поэтому нет никакого штрафа за использование подхода с отражением (он медленный в любом случае). Фактически, поскольку Python разработан как динамический, вы можете сделать много опрятных трюков, которые не были бы возможны на других языках (но, опять же, это медленный путь).

+0

Можете ли вы назвать некоторые из опрятных трюков питона protobuf? – xosp7tom

+0

Простите, я давно не работал над кодом. Я помню, что я был в восторге от некоторых из моих оптимизаций, но больше не могу вспомнить, что они собой представляют. (Большая часть библиотеки Python не была написана мной, но я немного оптимизировал ее работу ...) –