在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__
中的代码在需要执行时自然地位于{
为此,我创建了一个类似的函数版本,它的样板代码更少,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
的使用经验很少。在
最近几年,Python开发策略看起来像是“让我们在Python中集成来自其他语言的每一个特性”,这使得能够以各种方式完成单个任务。在
所以确实没有“首选的方法”去做一些事情,这完全取决于开发者想要做什么。因此,在某些情况下,可能需要使用
Class
来创建有状态函数并允许扩展它。在IMO中,使用带nonlocal
的闭包更为常见,而且没有任何不直观的地方。另一个问题是,当对方法修饰符使用这种方法时,对于函数,您必须编写更少的代码,而对于类,您必须添加更多的“魔力”,因为self
。在在Python中,函数可以有属性,因此另一种编码方法是使用},尽管这种方法比您所描述的方法更不常见。在
x
作为f
内部函数的属性,而不是{编辑:在return语句中添加了额外的缩进
相关问题 更多 >
编程相关推荐