我最近一直在学习Python,并为它出色的运行时元编程能力而感到惊讶。以前,我在阅读Smalltalk时曾遇到过“运行时元编程”一词,据我所知,Smalltalk具有最佳的运行时元编程功能。 Python与Smalltalk w.r.t的叠加程度如何元编程?两种语言所采用的方法之间的显着区别是什么?

最佳答案

Python实际上在这里保持得很好。 Smalltalk通常不会在程序和元程序之间做出明确区分,但Python会更明确-例如,针对装饰器的特殊语法或针对元编程 Hook 的__foo__()命名约定。这是一件好事。

另一方面,这是一个苹果到橙色的比较。与Python相比,Smalltalk是一种更小的,更紧密的语言,因此使用元程序进行操作的 Material 更少。例如,考虑__getattr__()。这是一个 Hook ,可让Python对象提供属性访问的自定义实现。 Smalltalk没有这样的东西。但! Smalltalk强制对对象的内部状态进行更严格的封装,并且没有与Python中使用的object.attribute语法等效的方法。因此,读取对象的状态需要通过一种方法...这正是__getattr__()提供的。因此,在许多情况下,您将在Python中使用__getattr__(),您只需在Smalltalk中编写一个普通方法-无需元编程。

到处都是这样:Python的__getitem__()和 friend 使得编写模仿列表或字典的类成为可能。 Smalltalk不需要这样做,因为Array和Dictionary只是常规的Smalltalk类,并且没有使用它们的特殊语法。 Python __eq__()等启用运算符重载。 Smalltalk没有运算符,因此您无需执行任何特殊操作即可实现+。 Python的contextlib提供了一些漂亮的工具来实现您自己的上下文管理器。 Smalltalk没有with构造,但是它确实具有针对lambda的轻量级语法,这使您可以直接进行相同的操作。

Smalltalk的元编程工具往往是相当底层的。例如,您可以创建自己的CompiledMethod实例,并将其粘贴到类的方法字典中。您也可以编写自己的编译器,并指定使用该类编译所有特定方法。这可以实现各种功能-我已经看到了使用替代语法进行试验的项目,用于概要分析的工具字节码,陷阱对实例变量的读写以实现透明持久性等。

Smalltalk的元编程工具功能强大,但它们的组织性不如Python的组织得井井有条,而且使用频率也不高。

10-05 20:55
查看更多