2016-05-21 9 views
1

したがって、probability mass functionのような次のクラスを定義しました。しかし、そのロジックが壊れていると私は新しいオブジェクトを初期化しようとするたびにSUM_ERRORを上げるでしょう。`__init __()`は常にエラーを発生させます

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 

どうすればこの問題を解決できますか?

+0

Canonicalの構文:

dict.__init__(self, pm) 

より一般的な方法は、組み込みのsuper()を使用することです。 'q = ProbabilityMass({...})' –

+0

'print(sum(self.values()))'です。私の推測では、浮動小数点の問題があり、その合計が1に非常に近いことだけを要求する必要があるということです。 –

+0

あなたのコードを使用して初期化するときにdictを与えると、 'self.values()'は空のリストです。 'self.keys()'と同じです –

答えて

2

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()) 
+0

Ops、それは単にタイプミスです。それはもともと 'any(...)'でした。 –

+2

@Neysofuそれでも間違いでしょう。たぶんあなたは '何も返されない(...)'を意味するかもしれません。 – Selcuk

0

dict.__init__()が呼び出されたときにdict()を使用しているため通常、それはあります。クラスが関数のように呼び出されると、インスタンスが作成され、クラスの引数を指定してインスタンスの.__init__()メソッドが呼び出されます。インスタンスメソッドを呼び出すことは、インスタンスを第1引数としてクラスメソッドを呼び出すことと同じです。したがって、x = dict()がために短いです:あなたは既に初期化されなかったdictのインスタンス(またはそのサブクラス)を持っている場合は、__init__()を自分で呼び出すことができます

x = new dict instance 
dict.__init__(x) 

。あなたは、しかし、最初の引数としてインスタンスを渡すために覚えておく必要があります。

super(ProbabilityMass, self).__init__(pm) 
関連する問題