同一本书中的同一个例子:Python deep nesting factory functions
def maker(N):
def action(X):
return X ** N
return action我理解它背后的概念,我认为它真的很好,但我似乎无法想象什么时候我可以使用这种方法。
通过让maker()同时使用N和X作为参数,我可以很容易地实现上面的内容。
有没有人使用过这种类型的工厂函数,并向我解释了为什么您采用这种方法而不是只使用多个参数?
这仅仅是用户偏好吗?
发布于 2013-10-23 17:24:11
squarer = maker(2)
print(squarer(2)) # outputs 4
print(squarer(4)) # outputs 16
print(squarer(8)) # outputs 64本质上,这意味着您只需要输入一次N值,然后您就不能在以后更改它。
我认为这主要是编程风格,因为有多种方法来做相同的事情。但是,这样您只能输入一次N值,这样就可以添加代码来测试它是有效值一次,而不是每次调用函数时检查。
编辑只是想到了一个可能的例子(尽管它通常是通过使用类来处理的):
writer = connectmaker("127.0.0.1")
writer("send this text")
writer("send this other text")然后,"maker“方法将连接到地址一次,然后为每次对writer()的调用维护该值。但是正如我所说的,类似这样的东西通常是__init__存储值的类。
发布于 2013-10-23 17:22:41
在某种程度上,您也可以看到一些operator函数。
例如,operator.itemgetter()的工作方式如下:
import operator
get1 = operator.itemgetter(1) # creates a function which gets the item #1 of the given object
get1([5,4,3,2,1]) # gives 4这常被用作排序函数等的key=函数。
如果您有一个可以解决的具体问题,那么更多的专用用例是很容易想象的。
在同一个联盟中,你有这样的“装饰设计师”:
def indirect_deco(outer_param):
def real_deco(func):
def wrapper(*a, **k):
return func(outer_param, *a, **k)
return wrapper
return real_deco
@indirect_deco(1)
def function(a, b, c):
print (((a, b, c))
function(234, 432)在这里,外部函数也是一个工厂函数,它创建了“真正的装饰”功能。这反过来,甚至创造了另一个人,取代原来的一个。
https://stackoverflow.com/questions/19548164
复制相似问题