一个愚蠢的问题,但这让我很烦恼(不管我的愚蠢被否决了!):我想我已经意识到了一种荒谬的恐惧,害怕在该方法使用的方法之外(不改变)生成数据,但我不确定如果是这样的话。
假设我有一个方法myfx
,它需要一些字典datadex
,这需要一个冗长的操作来完成,但对于该 session 期间的所有调用都是通用的.最简单但不可行的方法是:
def myfx(x,foo):
datadex={f:42 for f in foo} #initialise
mungeddata=datadex[x]+1 #munge
return mungeddata
但是那样会浪费太多时间。所以最好的办法是像处理类变量一样在主作用域中使用一次:
datadex={f:42 for f in foo} #initialise
def myfx(x):
mungeddata=datadex[x]+1 #munge
return mungeddata
然而,不知道为什么,我却极力避免这种情况。这很不雅观,但我认为情况并非如此。我通常诉诸闭包:
def initialise(foo):
datadex={f:42 for f in foo} #initialise
def myfx(x):
mungeddata=datadex[x]+1 #munge
return mungeddata
return myfx
或者更糟的是上课。我几乎只用 Python 和 JS 编写代码。我最好的猜测是它是我 Perl 编码时代的倒退——潜意识里我发现自己首先编写变量是 alla Pascal,所以我认为一些习惯像阴影一样挥之不去——但这并不能解释类或闭包方式,因为 OO-Perl 是完全不同。
最佳答案
类是封装此行为的正确方法。您有一些数据由多个函数调用共享。
class MungedData(object):
def __init__(self, foo):
self.datadex = {f:42 for f in foo}
def myfx(self, x):
return self.datadex[x] + 1
md = MungedData(somefoo)
print(md.myfx(arg1))
print(md.myfx(arg2))
虽然肯定还有其他替代方法,但这将是 Python 中最常见和最直接的方法。
关于在方法之外生成数据的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35300097/