我最近一直在学习Python,并对它卓越的运行时元编程能力感到惊讶。之前,我在阅读Smalltalk时遇到了“运行时元编程”这个术语,据我所知,Smalltalk拥有最好的运行时元编程能力。Python与Smalltalk w.r.t相比有多好。元编程?两种语言所采用的方法有什么显著的区别?
发布于 2011-07-28 12:08:14
Python实际上在这里表现得相当不错。Smalltalk通常不会明确区分程序和元编程,但Python更明确-例如,装饰器的特殊语法或元编程挂钩的__foo__()命名约定。这是一件好事。
另一方面,这有点像是苹果和橙子的比较。Smalltalk是一种比Python更小、更紧凑的语言,因此使用元程序操作的材料更少。例如,考虑__getattr__()。这是一个钩子,它允许Python对象提供自定义的属性访问实现。Smalltalk没有这样的东西。但!Smalltalk强制对对象的内部状态进行更紧密的封装,并且没有与object.attribute中使用的语法等效的语法。所以读取一个对象的状态需要通过一个方法...这正是__getattr__()所提供的。因此,在Python语言中使用__getattr__()的很多情况下,你只需要在Smalltalk中编写一个普通的方法--不需要元编程。
到处都是这样:Python的__getitem__()和朋友使得编写模拟列表或字典的类成为可能。Smalltalk不需要这样做,因为Array和Dictionary只是常规的Smalltalk类,没有特殊的语法来使用它们。Python、__eq__()等允许操作符重载。Smalltalk没有运算符,所以您可以实现+,而不需要做任何特殊的事情。Python的contextlib提供了一些很好的工具来实现您自己的上下文管理器。Smalltalk没有with结构,但它确实有针对lambdas的真正轻量级语法,这让您可以以一种简单的方式做同样的事情。
Smalltalk的元编程工具往往是相当低级的。例如,您可以创建自己的CompiledMethod实例,并将它们放入类的方法字典中。您还可以编写自己的编译器,并指定使用它编译特定类的所有方法。这使得各种各样的事情成为可能--我见过一些项目尝试使用替代语法、用于分析的仪器字节码、用于透明持久化的对实例变量的陷阱读写等等。
Smalltalk的元编程功能很强大,但它们的组织不如Python的整洁,也不像Python那样经常使用。
发布于 2011-07-29 03:22:52
在提问者的要求下作为答案发布。
Smalltalk的一个重要思想是正交性。坦率地说,Python在这方面受到了影响。并不是所有的东西都能在所有的东西上工作。示例:
inspect.getargspec()不适用于内置函数或调用functools.partial的结果(在C解释器中,strings.myclass = type('x', (object,), {'__init__': partial(foo, value)})仅适用于语句functools.partial expression cannot be exec生成一个无法实例化的类,而传递等效的lambda表达式而不是partial可以很好地工作。(尽管这可能只是一个错误,而不是一个特性。)也许PyPy没有这些问题,我不确定。但我确实非常喜欢Python,并且发现在实际应用程序中使用元类、currying和偶尔的描述符非常方便。
https://stackoverflow.com/questions/6852189
复制相似问题