我在CPython的2.6(原来的Python实现)试图此代码段random.Random(蟒蛇/ CPython的2.6):问题继承
from random import Random, random
class Uniform(Random, object):
def __init__(self, min, max):
self._min =min
self._max =max
def randint(self):
return super(Uniform, self).randint (self._min, self._max)
def uniform(self):
return super(Uniform, self).uniform(self._min, self._max)
if __name__ == '__main__':
a=Uniform(0., 1.2)
print a.uniform()
print a.randint()
虽然这似乎是正确 Python的继承,它抛出这个错误:
/tmp/source.py in <module>()
11
12 if __name__ == '__main__':
---> 13 a=Uniform(0., 1.2)
14 print a.uniform()
15 print a.randint()
TypeError: seed expected at most 1 arguments, got 2
WARNING: Failure executing file: </tmp/source.py>
但如果你定义
def __init__(self, min, max):
为
def __init__(self, (min, max)):
事情会奇迹般地去“正确” ..但最初产生的随机数将永远为统一的所有实例相同的(因为相同的初始种子的!)。
问题的根源
的random.Random
类是新式类,肯定它不是基本类(见/usr/lib/python2.6/random.py在Unix及其等价物在Win)。因此,我们的课程将涉及内置类的子类化。 random.Random
类 - 尽管其新类型的子类在C(在/usr/lib/python2.6/random.py中看到的第一类,请参阅import _random
- 它是内置类!)。
这是什么意思?我们需要重写__new__
方法,就好像它是内置类本身(更多在这里:problem subclassing builtin type)。
FINAL替代方法SHORT
只需添加__new__
方法(即random()
被进口在该“问题”的2号线和刚对象现场random.Random.seed(x)
初始化对象的种子(背后传递的首要在/usr/lib/python2.6/random.py))。
class Uniform(Random, object):
def __new__(cls, *args, **kwargs):
return super (Uniform, cls).__new__ (cls, random())
def __init__(self, min, max):
self._min =min
self._max =max
在Python中享受内置的Mersenne Twister随机数生成器;-)祝您好运!