为什么protobuf使用__metaclass__属性生成python类?

时间:2017-01-12 15:22:07

标签: python linux class protocol-buffers meta

protobuf生成C ++ / Java类,这些类是静态类型的类,足以进行编码/解码。为什么它使用元类属性生成python类:我认为普通类就足以执行rpc,就像C ++ / Java生成的类一样。

为什么python应该使用动态类? 感谢。

1 个答案:

答案 0 :(得分:3)

大多数情况下,因为它更容易阅读。

C ++和Java的代码生成器实际上很难理解和编辑,因为你必须同时遵循生成器代码和生成的代码。

Python代码生成器可以以相同的方式完成。但是,由于Python是一种动态语言,因此可以使用元类。从本质上讲,这允许在运行时构造大多数代码。元类比代码生成器更容易阅读和编辑,因为它完全是Python,没有丑陋的打印语句。

现在,您可能会认为Java可以做类似的事情:生成非常简单的类,然后使用反射来读取和写入字段。问题在于Java是一种编译语言。编译代码将比基于反射的代码执行得更好。但是,Python并没有编译,因此使用反射方法没有太大的代价(无论哪种方式都很慢)。事实上,因为Python被设计成动态的,你可以做很多在其他语言中无法实现的巧妙技巧(但是,无论如何,它都很慢)。