`__init \ \ \()`始终引发

2024-10-02 08:20:40 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我定义了下面的类,它应该类似于probability mass function。但是,它的逻辑似乎被破坏了,每当我尝试初始化一个新对象时,它都会引发SUM_ERROR。你知道吗

class ProbabilityMass(dict):

  class InvalidEntries(Exception):
    pass

  SUM_ERROR = InvalidEntries("all values must add upto '1'")
  VAL_ERROR = InvalidEntries("negative values are not allowed")

  def __init__(self, pm):
    dict.__init__(pm)
    # Input requirements
    if not self.sumsUptoOne():
      raise ProbabilityMass.SUM_ERROR
    if not self.isNonnegative():
      raise ProbabilityMass.VAL_ERROR

  def isNonnegative(self):
    return all(d < 0 for d in self.values())

  def sumsUptoOne(self):
    return sum(self.values()) == 1

我怎样才能解决这个问题?你知道吗


Tags: selfifinitdefnoterrorvalall
2条回答

通常,调用dict.__init__()是因为使用了dict()。当像函数一样调用一个类时,会创建一个实例,并使用给定给该类的参数调用实例的.__init__()方法。嗯,调用实例方法和调用以实例作为第一个参数的类方法是一样的。因此,x = dict()是:

x = new dict instance
dict.__init__(x)

如果已经有一个未初始化的dict(或子类)实例,可以自己调用__init__()。但是,您必须记住将实例作为第一个参数传递:

dict.__init__(self, pm)

更常见的方法是使用内置的super()

super(ProbabilityMass, self).__init__(pm)

调用dict.__init__()不会初始化类。对super的正确调用应该如下所示:

def __init__(self, pm):
    super(ProbabilityMass, self).__init__(pm)
    # Input requirements
    ...

顺便说一下,您的isNonnegative()方法也不正确。更改为:

def isNonnegative(self):
    return all(d >= 0 for d in self.values())

相关问题 更多 >

    热门问题