2016-05-21 20 views
1

Also habe ich die folgende Klasse definiert, die einem probability mass function ähneln sollte. Seine Logik scheint jedoch gebrochen zu sein und es wird jedesmal, wenn ich versuche, ein neues Objekt zu initialisieren, SUM_ERROR auslösen.`__init __()` löst immer Fehler

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 

Wie kann ich das beheben?

+0

Canonical Syntax. 'q = Wahrscheinlichkeitsmass ({...})' –

+0

'print (Summe (self.values ​​()))'. Meine Vermutung ist, dass Sie Gleitkomma Probleme haben und nur erfordern, dass die Summe sehr nahe bei 1 ist. –

+0

Mit Ihrem Code, und geben Sie ihm ein Diktat, wie Sie es initialisieren, 'self.values ​​()' ist eine leere Liste, wie auch 'self.keys()' –

Antwort

2

Der Aufruf dict.__init__() initialisiert die Klasse nicht. Der korrekte Aufruf super soll wie folgt aussehen:

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

Als Randbemerkung, Ihre isNonnegative() Methode auch falsch ist. Ändern Sie ihn auf:

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

Ops, es ist nur ein Tippfehler; es war ursprünglich 'any (...)' –

+2

@Neysofu Es wäre immer noch falsch. Vielleicht meintest du '' '' '' '' '' – Selcuk

0

Normalerweise, wenn dict.__init__() genannt wird, ist es, weil Sie dict() verwendet. Wenn eine Klasse wie eine Funktion aufgerufen wird, wird eine Instanz erstellt, und die Methode .__init__() der Instanz wird mit den Argumenten aufgerufen, die der Klasse übergeben wurden. Nun, das Aufrufen einer Instanzmethode ist dasselbe wie das Aufrufen der Klassenmethode mit der Instanz als erstem Argument. Daher ist x = dict() kurz für:

x = new dict instance 
dict.__init__(x) 

Wenn Sie bereits eine Instanz von dict (oder eine Unterklasse) haben, die nicht initialisiert wurde, können Sie __init__() selbst nennen. Sie müssen jedoch erinnern die Instanz als erstes Argument übergeben:

dict.__init__(self, pm) 

Die häufigere Art und Weise ist die eingebaute in super() zu verwenden:

super(ProbabilityMass, self).__init__(pm) 
Verwandte Themen