Javascript 为其对象使用基于原型(prototype)的模型。然而,该语言非常灵活,很容易用几行代码编写功能来替代其他类型的结构。例如,可以制作一个 class
函数,模拟标准的类行为,包括继承或私有(private)成员。或者可以通过编写来模仿功能工具,例如,curry
函数,它将接受一个函数及其一些参数并返回部分应用的函数。
我想知道是否可以反过来,用更经典的语言模仿原型(prototype)方法。特别是我一直在思考是否可以在 Python 中模仿原型(prototype),但缺乏对匿名函数的支持(比 lambda 更通用)让我陷入困境。
Is it possible to write some functions to mimic propotypes in class-based languages, in particular in 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
原型(prototype),可以作为 makeObject
的第二个参数传递功能。该函数应修改 foo.__getattr__
和 foo.__setattr__
如下:每当在 foo
中找不到该属性时,应该在foo.prototype
中搜索.
因此,我认为我能够实现这一点,期望一件事:除了预先声明它们并将它们附加到我的对象之外,我想不出任何方法来声明比 lambda 更复杂的方法。问题是缺少匿名函数。我在这里问是因为也许一些 Python 大师可以找到一些聪明的方法来规避这个问题。
最佳答案
在 Python 中比在 JS 中容易得多。您的 JS 代码可以用 Python 替换为:
>>> class Foo(object):
... pass
>>> foo = Foo()
>>> foo.bar = 1
>>> foo.foobar = 2
然后你也可以动态添加方法
>>> foo.method = lambda x: x**2
>>> foo.method(2)
4
对于比 lambda 更复杂的方法,您将它们声明为函数,它们将可以访问 foo 本身,没问题:
>>> def mymethod(self, bar, foobar):
... self.bar = bar
... self.foobar = foobar
>>> foo.mymethod = mymethod
>>> foo.mymethod(1,2)
>>> foo.bar
1
>>> foo.foobar
2
或者就此而言:
>>> mymethod(foo, 3, 4)
>>> foo.bar
3
>>> foo.foobar
4
同样的事情。
如您所见,用 Python 执行您的示例几乎简单得离谱。问题是为什么。 :) 我的意思是,这样会更好:
>>> class Foo(object):
... def __init__(self, bar, foobar):
... self.bar = bar
... self.foobar = foobar
... def method(self, x):
... return x**2
关于javascript - Python 中的原型(prototype)编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4629224/