Javascript 对其对象使用基于原型的模型。尽管如此,该语言非常灵活,并且很容易编写几行函数来替代其他类型的构造。例如,可以创建一个class
函数,模拟标准的类行为,包括继承或私有成员。或者,可以通过编写一个函数来模拟函数式工具,例如,一个curry
函数将接受一个函数及其一些参数并返回部分应用的函数。
我想知道是否可以做相反的事情并在更经典的语言中模仿原型方法。特别是我一直在思考是否可以在 Python 中模仿原型,但是缺乏对匿名函数(比 lambda 更通用)的支持让我陷入了困境。
是否可以编写一些函数来模仿基于类的语言中的原型,特别是在 Python 中?
编辑让我举一些例子来说明如何实现这样的事情(但我并不能真正做到这一切)。
首先,最接近 Javascript 对象的是 Python 字典。所以我们可以有简单的对象,比如
foo = {
'bar': 1,
'foobar': 2
}
当然我们要添加方法,只要方法适合 lambda,这不是问题
foo = {
'bar': 1,
'foobar': 2,
'method': lambda x: x**2
}
所以现在我们可以调用例如
foo['method'](2)
>>> 4
现在,如果我们有任意函数作为方法,我们可以像这样继续。首先,我们需要内部的函数foo
可以访问foo
自身;否则它们只是普通函数而不是方法。
我想可以通过对 应用一个makeObject
函数来做到这一点,该函数foo
循环遍历foo
值,并且每当找到可调用的值时,都会修改其属性以作为其第一个参数__call__
传递。foo
在这个阶段,我们将拥有自立对象,无需创建类即可声明。
然后我们需要能够给出foo
一个原型,它可以作为makeObject
函数的第二个参数传递。该函数应修改如下:只要在foo.__getattr__
中foo.__setattr__
找不到该属性foo
,就应在 中搜索该属性foo.prototype
。
所以,我想我能够实现这一点,期待一件事:除了事先声明它们并将它们附加到我的对象之外,我想不出任何方法来声明比 lambdas 更复杂的方法。问题是缺少匿名函数。我在这里问是因为也许一些 Python 大师可以找到一些巧妙的方法来规避这个问题。