`__init__()` 总是引发错误
`__init__()` always raises error
因此,我定义了以下 class,它应该类似于 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
我该如何解决这个问题?
调用 dict.__init__()
不会初始化 class。对 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())
通常调用dict.__init__()
是因为你使用了dict()
。当像函数一样调用 class 时,会创建一个实例,并使用提供给 class 的参数调用实例的 .__init__()
方法。好吧,调用实例方法与以实例作为第一个参数调用 class 方法是一样的。因此,x = dict()
是以下简称:
x = new dict instance
dict.__init__(x)
如果您已经有一个未初始化的dict
(或子class)的实例,您可以自己调用__init__()
。但是,您必须,请记住将实例作为第一个参数传递:
dict.__init__(self, pm)
更常见的方法是使用内置的 super()
:
super(ProbabilityMass, self).__init__(pm)
因此,我定义了以下 class,它应该类似于 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
我该如何解决这个问题?
调用 dict.__init__()
不会初始化 class。对 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())
通常调用dict.__init__()
是因为你使用了dict()
。当像函数一样调用 class 时,会创建一个实例,并使用提供给 class 的参数调用实例的 .__init__()
方法。好吧,调用实例方法与以实例作为第一个参数调用 class 方法是一样的。因此,x = dict()
是以下简称:
x = new dict instance
dict.__init__(x)
如果您已经有一个未初始化的dict
(或子class)的实例,您可以自己调用__init__()
。但是,您必须,请记住将实例作为第一个参数传递:
dict.__init__(self, pm)
更常见的方法是使用内置的 super()
:
super(ProbabilityMass, self).__init__(pm)