将函子创建为可调用类或嵌套函数

2024-09-29 23:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python 3中,可以创建如下类:

class foo:
    def __init__(self, x):
        self.x=x

    def __call__(self, y):
        self.x = self.x + 1
        return (self.x, y)

然后我们可以用它作为一个函子,它的状态是这样的:

^{pr2}$

实际上,我创建了一个返回函数的函数。然而,第一个函数实际上是一个返回可调用对象的构造函数。这样一来,开发人员就可以扩展类、添加方法等,从而打开了一系列的蠕虫病毒。此外,__init__中的代码在需要执行时自然地位于{}中的代码之前,而这在类构造中并不清楚。最后,python3'way'建议在类上使用函数。在

为此,我创建了一个类似的函数版本,它的样板代码更少,IMHO读起来更自然:

def bar(x):
    def f(y):
        nonlocal x
        x = x + 1
        return (x,y)
    return f

functor2 = bar(5)
x = 345234234
print('(2.1) ', functor2(7))
print('(2.2) ', functor2(8))
print('(2.3) ', functor2(9))

但是,它使用nonlocal,可能由于我没有想到的原因而不是直观的。第二种方法是好的做法,还是有危险的矿坑淘汰?在python3中哪个应该是首选的?尤其是我对nonlocal的使用经验很少。在


Tags: 方法函数代码selfreturnfooinitdef
1条回答
网友
1楼 · 发布于 2024-09-29 23:23:32

最近几年,Python开发策略看起来像是“让我们在Python中集成来自其他语言的每一个特性”,这使得能够以各种方式完成单个任务。在

所以确实没有“首选的方法”去做一些事情,这完全取决于开发者想要做什么。因此,在某些情况下,可能需要使用Class来创建有状态函数并允许扩展它。在IMO中,使用带nonlocal的闭包更为常见,而且没有任何不直观的地方。另一个问题是,当对方法修饰符使用这种方法时,对于函数,您必须编写更少的代码,而对于类,您必须添加更多的“魔力”,因为self。在

在Python中,函数可以有属性,因此另一种编码方法是使用x作为f内部函数的属性,而不是{},尽管这种方法比您所描述的方法更不常见。在

def bar(x):
    def f(y):
        f.x=f.x+1
        return (f.x, y)
    f.x=x
    return f

编辑:在return语句中添加了额外的缩进

相关问题 更多 >

    热门问题