javascript - Python 中的原型(prototype)编程

标签 javascript python inheritance prototype prototypal-inheritance

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/

相关文章:

javascript - 使用 jquery 删除一个 div 但将 div 保留在其中

javascript - 如何删除括号、引号并在每个逗号后为 const 添加空格 - javascript

python - 如何使用 pudb 调试器调试单元测试?

java - 如何访问从父类(super class)传递下来的子类属性?

java - 使用继承的可链接 getter/setter 的正确实现是什么? ( java )

c++ - 描述为什么在 C++ 中不允许将基类指针转换为派生类指针

javascript - 如何从字符串中获取 javascript 中邮政编码的 4 个序列号?

javascript - 使用 V8 将 JavaScript 编译为原生代码

android - Android 上的 Pygame

python - 将二维 numpy 数组转换为字符串