gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:14:50 32 4
gpt4 key购买 nike

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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com