我已经在CPython 2.6 (原始python实现)中尝试了这个代码片段:
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()虽然它似乎是正确的 pythonic继承,但它引发了这个错误:
/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/Rand.py,在Unix上,它在Win上等效)。因此,关于内建类的子类问题--将出现在我们的课程中。random.Random类--尽管它的新样式特性是用C编写的初等类中的子类(in /usr/lib/python2.6/ import _random -and --参见import _random-and,它是内置类!)。
什么意思?我们需要覆盖__new__方法,就像它本身是内置类一样(更详细的是:problem subclassing builtin type)。
最后的解决办法--简称
只需添加__new__方法的重写( random()是在这个“问题”的第2行中导入的,只是在场景后面传递给random.Random.seed(x)以初始化对象种子的对象(在/usr/lib/python2.6/随机性. of的源文件中)。
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随机数生成器;-)祝您好运!
发布于 2011-02-28 22:16:26
您需要在构造函数的开头调用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就足够了。
https://stackoverflow.com/questions/5148198
复制相似问题