mis*_*tor 10 python oop programming-languages smalltalk metaprogramming
我最近一直在学习Python,并且对其出色的运行时元编程功能感到惊讶.以前我遇到过"运行时元编程"这个术语,当时我正在阅读关于Smalltalk的内容,据我所知,Smalltalk拥有最佳的运行时元编程功能.Python与Smalltalk和元编程相比有多好?两种语言采用的方法之间有什么显着差异?
Col*_*ney 12
Python在这里实际上相当不错.Smalltalk通常不会明确区分程序和元程序,但Python更明确 - 例如,装饰器的特殊语法或__foo__()元编程钩子的命名约定.这是一件好事.
另一方面,它有点像苹果到橙子的比较.Smalltalk是一种比Python更小,更紧凑的语言,因此使用元程序操作的材料更少.例如,考虑一下__getattr__().这是一个钩子,允许Python对象提供属性访问的自定义实现.Smalltalk没有这样的东西.但!Smalltalk强制对对象的内部状态进行更严格的封装,并且没有相应的object.attributePython语法.因此,读取对象的状态需要通过一个方法......这正是__getattr__()提供的方法.因此,对于许多你__getattr__()在Python中使用的情况,你只需在Smalltalk中编写一个普通的方法 - 不需要元编程.
它就像是遍布整个地方:Python __getitem__()和朋友可以编写模仿列表或词典的类.Smalltalk不需要它,因为Array和Dictionary只是常规的Smalltalk类,并且没有使用它们的特殊语法.Python __eq__()等使运算符重载.Smalltalk没有运算符,因此您可以+在不做任何特殊操作的情况下实现.Python的contextlib提供了一些实现自己的上下文管理器的漂亮工具.Smalltalk没有with构造,但它确实具有lambdas的非常轻量级的语法,它允许您以直接的方式执行相同类型的操作.
Smalltalk的元编程设施往往很低级.例如,您可以创建自己的CompiledMethod实例,并将它们粘贴到类的方法字典中.您也可以编写自己的编译器,并指定使用它编译特定类的所有方法.这可以实现各种各样的事情 - 我已经看到了用替代语法进行实验的项目,用于分析的工具字节码,用于透明持久性的陷阱读取和写入实例变量等等.
Smalltalk的元编程功能很强大,但它们不像Python那样整齐有序,并且不经常使用.
wbe*_*rry 10
在提问者的要求下作为答案发布.
Smalltalk的一个重要思想是正交性.坦率地说,Python在这方面受到了影响.并非一切都适用于一切.例子:
inspect.getargspec()不适用于内置函数或调用结果functools.partial(无论如何都在C解释器中).eval仅适用于表达式字符串,exec仅适用于语句字符串.myclass = type('x', (object,), {'__init__': partial(foo, value)})生成一个无法实例化的类,而传递一个等效的lambda表达式而不是partial工作正常.(虽然这可能只是一个错误而不是一个功能.)也许PyPy没有这些问题,我不确定.但我非常喜欢Python,并且发现在实际应用程序中使用元类,currying和偶尔的描述符非常方便.
| 归档时间: |
|
| 查看次数: |
1303 次 |
| 最近记录: |