gpt4 book ai didi

python - 对象或闭包 - 何时使用?

转载 作者:太空狗 更新时间:2023-10-29 17:11:44 25 4
gpt4 key购买 nike

我可以定义一个对象并分配属性和方法:

class object:
def __init__(self,a,b):
self.a = a
self.b = b
def add(self):
self.sum = self.a + self.b
def subtr(self):
self.fin = self.sum - self.b
def getpar(self):
return self.fin

obj = object(2,3)
obj.add()
obj.subtr()
obj.getpar()

或者通过定义闭包来提供相同的功能:

def closure(a,b):
par = {}
def add():
par.update({'sum':a+b})
def subtr():
par.update({'fin':par['sum']-b})
def getpar():
return par['fin']
return {'add':add,'subtr':subtr,'getpar':getpar}

clos = closure(2,3)
clos['add']()
clos['subtr']()
clos['getpar']()

我认为对象语法对大多数观众来说看起来更清晰,但是否存在使用闭包在语义上更可取的实例?

最佳答案

您应该使用最清楚地表达您要实现的目标的版本。

在给出的例子中,我会说对象版本更清晰,因为它似乎是在为一个状态不断变化的对象建模。查看使用该值的代码,对象版本似乎表达了明确的意图,而闭包版本似乎有一些无关紧要的操作(索引和“魔术”字符串)。

在 Python 中,当需要的东西大部分类似于函数,并且可能需要捕获某些状态时,我更喜欢基于闭包的方法。

def tag_closure(singular, plural):
def tag_it(n):
if n == 1:
return "1 " + singular
else:
return str(n) + " " + plural
return tag_it

t_apple = tag_closure("apple", "apples")
t_cherry = tag_closure("cherry", "cherries");
print t_apple(1), "and", t_cherry(15)

这可能比下面的更清楚一点:

class tag_object(object):
def __init__(self, singular, plural):
self.singular = singular
self.plural = plural

def tag(self, n):
if n == 1:
return "1 " + self.singular
else:
return str(n) + " " + self.plural

t_apple = tag_object("apple", "apples")
t_cherry = tag_object("cherry", "cherries");
print t_apple.tag(1), "and", t_cherry.tag(15)

根据经验:如果这个东西真的只是一个函数,而且它只是捕获静态状态,那么请考虑闭包。如果事物旨在具有可变状态,和/或具有多个功能,请使用类。

另一种表达方式:如果您正在创建一个闭包指令,那么您实际上是在手动复制类机器。最好将其留给设计用于执行此操作的语言结构。

关于python - 对象或闭包 - 何时使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3182603/

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