我希望能够将随机数生成器传递给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))
Run Code Online (Sandbox Code Playgroud)
...错误是我传递了一个新生成的随机数,而不是传递函数本身.
>>> s._rng
0.5013004813544717
>>> s._rng
0.5013004813544717
Run Code Online (Sandbox Code Playgroud)
这么简单的问题:如何将我最喜欢的带有指定参数的随机数生成函数传递给一个类,将它存储在变量中,并在需要时调用它?优选地,不期望我的类的用户(重新)在random模块中写入功能.
使用partialfrom functools来绑定参数并获取一个类似于函数的新对象,您可以调用它或将其作为类的参数提供.
>>> from functools import partial
>>> import random
>>> r = partial(random.betavariate, 2, 2)
>>> r()
0.7961360011285323
>>> r()
0.15143718490838257
Run Code Online (Sandbox Code Playgroud)
该函数被调用random.betavariate。当你这样做时random.betavariate(2, 2),你是用参数调用它。然后将此调用的结果(一个数字)传递给simulation。
如果你想传递函数本身,只需传递它:
s = simulation(random.betavariate)
Run Code Online (Sandbox Code Playgroud)
如果您还想传递参数,则必须单独进行(并设置您的类,以便它知道在哪里可以找到这些参数)。
您还可以传递一个将所需参数包装到调用中的临时函数,例如:
s = simulation(lambda: random.betavariate(2, 2))
Run Code Online (Sandbox Code Playgroud)
这传递了一个零参数函数,该函数在调用时调用random.betavariate(2, 2).