Ric*_*urr 6 python comparison language-features smalltalk language-comparisons
我已经看到了Smalltalk和Ruby之间以及Ruby和Python之间的一些比较,而不是Python和Smalltalk之间的比较.我特别想知道实现,语法,可扩展性和哲学的根本区别是什么.
例如,Python似乎没有Metaclasses.Smalltalk没有生成器的概念.尽管两者都被称为动态类型,但我相信Python不会进行动态方法调度.它是否正确?
例如,Python似乎没有Metaclasses.
确实如此 - 它不会为每个类隐式生成新的元类:它使用与父类相同的元类,或者type默认情况下.Python的设计理念,即"Python的禅宗",可以通过import this交互式解释器的提示进行阅读; 这里的适用点是第二个,"明确比隐含更好".
在Python 2.X中,您使用以下语法指定自定义元类:
class sic:
__metaclass__ = mymeta
...
Run Code Online (Sandbox Code Playgroud)
在Python 3.X中,更优雅的是,您使用命名参数语法:
class sify(metaclass=mymeta):
...
Run Code Online (Sandbox Code Playgroud)
Smalltalk没有生成器的概念.
Python的生成器是一流的(通常是独立的)函数,Smalltalk没有"独立"函数的概念 - 它在类中有方法.但它当然确实有迭代器 - 当然是类:
iterator := aCollection iterator.
[iterator hasNext] whileTrue: [iterator next doSomething].
Run Code Online (Sandbox Code Playgroud)
由于Smalltalk拥有一流的"代码块"(Ruby从中获取),您可以通过将代码块发送到合适的方法来完成迭代,就像其他"控制结构"一样,如果您希望可以直接使用集合(想想select:):
aCollection select: [:item | item doSomething].
Run Code Online (Sandbox Code Playgroud)
所以在Smalltalk(和Ruby)中,您将代码块发送到迭代; Python以相反的方式做事,迭代将值发送到周围的"调用"代码.看起来非常不同,但最终并没有"深刻"的不同.
一流的代码块意味着Smalltalk不需要也没有"控制结构"语句和关键字,例如:if或者while它们可以通过发送代码块作为适当方法的参数(例如ifTrue:布尔方法)来实现.(Ruby选择除了第一类代码块之外还有关键字/语句;我会说Python [[explicit]]和Smalltalk [[implicitly]]都尝试像C一样"提供单一的方法来执行一个操作",而Ruby更多的是在Perl-ish学校",有很多方法可以做到这一点").
尽管两者都被称为动态类型,但我相信Python不会进行动态方法调度.它是否正确?
不,绝对不正确 - Python 强烈地动态方法调度,极端.考虑例如:
for i in range(10):
myobject.bah()
Run Code Online (Sandbox Code Playgroud)
通过Python的语义,这个执行10个查找的方法bah中myobject-以防万一方法上一次执行已造成myobject完全重组本身内部,这样其目前的 bah方法是完全不同以前一个(可能是为A相当疯狂的事情程序员依靠这种激烈的动力,但Python支持它).这就是:
themethod = myobject.bah
for i in range(10):
themethod()
Run Code Online (Sandbox Code Playgroud)
Python代码中常见的手动优化 - 在循环之前进行一次动态查找,而不是循环内部10次,每条腿一次(这是"不断提升"的情况,因为编译器被禁止进行"常量折叠"本身通过Python的动态查找的极端规则 - 除非它能证明它是无害的,并且在实践中这样的证明太难了,因此Python实现通常不会打扰).
Python使用统一命名空间:方法是对象的属性,就像任何其他对象一样,除了它们是可调用的.这就是为什么在不调用它的情况下提取方法(称为"绑定方法"),在变量中设置对它的引用(或将其存储到列表或其他容器中,从函数返回它,无论如何)都是一个简单的简单的操作就像在上面的不断提升的例子中一样.
Smalltalk和Ruby为方法和其他属性分别设置了名称空间(在Smalltalk中,非方法属性在对象自己的方法之外是不可见的),因此"提取方法"和"调用结果对象"需要更多内省仪式(但是常见的)因此,在某些情况下,调度的情况可能会稍微简单一些 - 特别是,"仅提及"一个无参数的方法隐式调用它,而在Python中,就像在C中一样,调用是通过附加括号显式执行的,而"只是提到" "好吧......"只是提到"它,它可以用于任何形式的操作,包括调用;-).
Python肯定有元类.
Smalltalk有一些不寻常的功能:
| 归档时间: |
|
| 查看次数: |
3411 次 |
| 最近记录: |