2011-02-28 113 views
4

我在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随机数生成器;-)祝您好运!

回答

0

你需要在你的构造函数的开始调用Random.__init__(self, seed)(该seed参数是可选):

def __init__(self, min, max): 
    Random.__init__(self) # Use the default seed. 
    self._min =min 
    self._max =max 

另外,我不太明白为什么要明确扩大object为好;扩展Random应该就够了。