首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >问题子类random.Random (python /CPython 2.6)

问题子类random.Random (python /CPython 2.6)
EN

Stack Overflow用户
提问于 2011-02-28 22:12:03
回答 1查看 830关注 0票数 4

我已经在CPython 2.6 (原始python实现)中尝试了这个代码片段:

代码语言:javascript
复制
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继承,但它引发了这个错误:

代码语言:javascript
复制
/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>

但如果你定义

代码语言:javascript
复制
def __init__(self,  min,  max):

作为

代码语言:javascript
复制
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的源文件中)。

代码语言:javascript
复制
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随机数生成器;-)祝您好运!

EN

回答 1

Stack Overflow用户

发布于 2011-02-28 22:16:26

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

代码语言:javascript
复制
def __init__(self,  min,  max):
    Random.__init__(self)  # Use the default seed.
    self._min =min
    self._max =max

另外,我也不太明白为什么要显式地扩展object;扩展Random就足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5148198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档