一个愚蠢的问题,但这让我感到烦恼(不管我的愚蠢!):我认为我已经找到了一种荒谬的恐惧,即在方法使用的方法之外生成数据(不改变),但我不确定如果是这种情况。
假设我有一个方法myfx
,需要一些需要冗长操作的字典datadex
,但在该会话期间对所有调用都是通用的。最简单但不可行的方法是:
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是完全不同。
答案 0 :(得分:6)
类是封装此行为的正确方法。您有一些由多个函数调用共享的数据。
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中最常见,最直接的方法。
答案 1 :(得分:2)
Python函数是对象,可以有属性,如果你不想让你的函数在类中,你可以这样做:
def myfx(x):
mungeddata=myfx.datadex[x]+1 #munge
return mungeddata
myfx.datadex={f:42 for f in foo} #initialise
我想你要避免的是拥有一个全局变量。
答案 2 :(得分:0)
如果您真的只想避免面向对象的编程,可以执行以下操作来创建一个get_dict()
使用生成器来存储dict的地图。
def get_dict():
d = {f:42 for f in foo}
while True:
yield d
def myfx(x):
datadex = get_dict()
return datadex[x]+1 #munge
return myfx