我希望能够将随机数生成器传递给Python中的类。该类表示一个研究模拟,其中使用来自Beta分布的绘制来初始化某组变量,该分布可以使用random.betavariate(2,2)
生成,但我希望允许将来的用户插入不同类型的随机数字生成功能,如random.uniform(0,1)
。
当我尝试这样初始化时......
class simulation:
def __init__(self,rng):
self._rng = rng
s = simulation(random.betavariate(2,2))
...错误是我没有传递函数本身,而是传递一个新生成的随机数。
>>> s._rng
0.5013004813544717
>>> s._rng
0.5013004813544717
这么简单的问题:如何将我最喜欢的带有指定参数的随机数生成函数传递给一个类,将它存储在变量中,并在需要时调用它?最好不要期望我的班级用户(重新)在random
模块中编写函数。
答案 0 :(得分:8)
使用partial
中的functools
绑定参数并获取一个类似于函数的新对象,您可以调用该对象或将其作为类的参数提供。
>>> from functools import partial
>>> import random
>>> r = partial(random.betavariate, 2, 2)
>>> r()
0.7961360011285323
>>> r()
0.15143718490838257
答案 1 :(得分:4)
该函数名为random.betavariate
。当你执行random.betavariate(2, 2)
时,你会用参数调用它。然后,您将此调用的结果(一个数字)传递给simulation
。
如果你想传递函数本身,只需传递它:
s = simulation(random.betavariate)
如果你想传递参数,你必须单独进行(并设置你的类,以便它知道在哪里找到这些参数)。
您还可以传递一个ad-hoc函数,将您想要的参数包装到调用中,例如:
s = simulation(lambda: random.betavariate(2, 2))
这会传递一个零参数函数,在调用时会调用random.betavariate(2, 2)
。
答案 2 :(得分:0)
也许关闭?
>>> class simulation(object):
... def __init__(self, rng):
... self.rng = rng
...
>>> def f(func, *args):
... def ret():
... return func(*args)
... return ret
...
>>> bar = f(random.randint, 0, 9)
>>> s = simulation(bar)
>>> s.rng()
6
>>> s.rng()
3
>>> s.rng()
9
>>> s.rng()
1
>>>
虽然来自partial
的{{1}}看起来更自然。