2017-02-18 2 views
1

Ich habe diesen Code:Pass Ausgabe von Klasseninstanz als Eingabe in einem anderen

import numpy as np 

class B(): 
    def __init__(self, a,b): 
     self.a = a 
     self.b = b 

class Criteria(): 
    def __init__(self, method, minimum, maximum, measures=None): 
     self.method = method 
     self.minimum = minimum 
     self.maximum = maximum 
     self.measures = measures if measures is not None else None 

    def calcs(self): 
     if self.measures is not None: 
      for x in self.measures: 
       if (x.a > self.minimum and x.a < self.maximum): 
        x.a = 999 
     return self.measures 

    def avg(self): 
     if self.measures is not None: 
      return np.average([x.value for x in self.measures]) 
     else: 
      return np.average(3)# Here should be the result where None is defined 
           # Now I put just an arbitrary number 

class Evaluate(): 
    def __init__(self, criteria): 
     self.criteria = criteria 


testdata = np.array([Evaluate(
     np.array([Criteria('V', 1,100, 

       np.array([B(100, 0.1), 
          B(11, 0.3), 
          B(300, 0.2), 
          B(33, 0.1)],dtype=object) 
       ), 

       Criteria('AVG', 22, 220, None)]) 

)]) 


for x in testdata: 
    for idx, el in enumerate(x.criteria): 
     if el.method == 'V': 
      el.calcs() # this result must be passed as input to the `el.avg()` 
     if el.method == 'AVG': 
      el.avg() 

Ich habe eine Klasse B welche einige Daten (a und b Felder) hält.

Ich lade diese Daten in die Klasse Criteria, um die Kriterien zu durchlaufen und entsprechend zu ändern.

Dann wird die Evaluate Klasse alle oben genannten enthalten.

Ich verwende measures=None zur Criteria-Klasse, weil im Fall zum Beispiel für die avg-Funktion, habe ich möglicherweise keine Messungen, um auf ihnen den Durchschnitt zu berechnen, aber ich habe (das ist mein Fall) Messungen von vorherigen Kriterien Klasse auf die ich den Durchschnitt anwende.

Nun, was ich erreichen möchte, ist dies.

laden zunächst die Daten:

B(100, 0.1), 
B(11, 0.3), 
B(300, 0.2), 
B(33, 0.1) 

Diese Daten, die durch die Kriterien vorbei (durch die calcs Funktion ausgeführt wird), wird chage zu:

B(100, 0.1), 
B(999, 0.3), 
B(300, 0.2), 
B(999, 0.1) 

Nun werden die obigen Daten (die Das Ergebnis des ersten Kriteriums muss als Eingabe an das zweite Kriterium übergeben werden und den Durchschnittswert mit der Funktion avg berechnen. Ich weiß nicht, ob dies ohne ein Argument in der Funktion avg möglich ist self.

Also, mein endgültiges Ergebnis wird der Wert 599,5 sein.

Antwort

1

Hier ist eine Änderung Ihres Skripts. Hauptsächlich habe ich repr hinzugefügt. Aber ich änderte auch die None Fall für measures auf eine leere Liste []:

import numpy as np 

class B(): 
    def __init__(self, a,b): 
     self.a = a 
     self.b = b 
    def __repr__(self): 
     return 'B(%s, %s)'%(self.a, self.b) 

class Criteria(): 
    def __init__(self, method, minimum, maximum, measures=None): 
     self.method = method 
     self.minimum = minimum 
     self.maximum = maximum 
     self.measures = measures # may be None 

    def __repr__(self): 
     # **edit** work with None 
     if self.measures is None: 
      measures = 'measures: None' 
     else: 
      measures = [' measures:['] 
      for m in self.measures: 
       measures.append(' {}'.format(m)) 
      measures.append(' ]') 
      measures = '\n'+ '\n'.join(measures) 
     return 'C({0.method},{0.minimum},{0.maximum}, {1})'.format(self, measures) 

    def calcs(self): 
     if self.measures is not None: 
      for x in self.measures: 
       if (x.a > self.minimum and x.a < self.maximum): 

       x.a = 999 
    return self.measures 

    def avg(self, calcs=None): 
     # **edit** work with None and calcs 
     if calcs is None: 
      calcs = self.measures 
     if calcs is None: 
      return 'none' 
     elif len(calcs)==0: 
      return '[]' 
     else: 
      return np.average([x.a for x in calcs]) 

class Evaluate(): 
    def __init__(self, criteria): 
     self.criteria = criteria 
    def __repr__(self): 
     #return 'E({})'.format(self.criteria) 
     astr = 'Evaluate \n' 
     for c in self.criteria: 
      astr += '{}\n'.format(c) 
     return astr 


Betrachten wir eine Gruppe von Criteria Objekte machen. Ein AVG muss in irgendeiner Weise wissen, welche measures es verwendet. Eine Möglichkeit ist der measures Parameter, der während der Konstruktion verwendet wird.

b1 = np.array([B(100, 0.1), 
    B(11, 0.3), 
    B(300, 0.2), 
    B(33, 0.1)],dtype=object) 
b2 = np.array([B(1, 0.1), B(2,.5)]) 
c1 = Criteria('V', 1, 100, b1) 
c2 = Criteria('V', 2, 200, b2) 
c3 = Criteria('AVG', 22, 220, None) 
c4 = Criteria('AVG', 22, 220, c2.measures) 
c5 = Criteria('AVG', 22, 222, c1.measures) 

bearbeiten die Iteration ändern, um das letzte calcs Ergebnis zu speichern und nutzen, wenn die AVG Maßnahmen Keine ist. C.avg nimmt jetzt einen optionalen Parameter.

last_calcs = None 
for c in alist: 
    if c.method=='V': 
     last_calcs = c.calcs() 
     print('calcs', c.measures) 
    if c.method=='AVG': 
     if c.measures is None: 
      avg = c.avg(last_calcs) 
     else: 
      avg = c.avg() 
     print('AVG', avg) 

mit:

alist = [c3,c1,c3,c2,c3,c4, c5] 

dies erzeugt:

evaluate 
AVG none   # c3 with nothing preceeding 
calcs [B(100, 0.1) B(999, 0.3) B(300, 0.2) B(999, 0.1)] 
AVG 599.5  # c3 following c1 
calcs [B(1, 0.1) B(2, 0.5)] 
AVG 1.5   # c3 following c2 
AVG 1.5   # c4 with same measures as c2 
AVG 599.5  # c5 with same measures as c1 
+0

Hallo, danke für die Hilfe Ich kann nicht sehen, wie 'C (AVG zu machen.', um den Durchschnitt von' 100,999,300,999' zurückzugeben, was nur der Wert 999 ist. Sie sagen auch: 'So bewertet die V-Aktion die Mittelwerte, gibt sie zurück, ändert aber auch das B-Objekt, aber die' V'-Aktion hat nichts mit Durchschnittswerten zu tun . Es ruft die 'calcs'-Funktion auf, die einige Kriterien auf die Maße anwendet. Dann muss ich aus diesen neuen Werten die avegage herausziehen, indem ich' avg' function.As für das Setzen von 'None' im zweiten' Criteria', ' C (AVG, 22,220, None) ist, weil ich nicht weiß, wie ich damit umgehen soll. Ich will anstelle von None das Ergebnis von 'calcs' weitergeben. – George

+0

Wenn 'C = Kriterien ...', dann ändert 'C.calcs()' seine 'Maße'. 'C.avg()' gibt einen Wert basierend auf diesen 'Kennzahlen' zurück. In Ihrem Beispiel wird "calc" auf eine Liste von Kennzahlen angewendet, im Gegensatz zu einer anderen leeren Liste. Um beides zu tun, müssten Sie dieselbe Liste an zwei verschiedene "Kriterien" -Objekte übergeben. – hpaulj

+0

ich eine Liste in eine Liste criteria.The Änderungen am versorgen, wenn ich das 'calcs' method.Then nennen, ich habe diese neue Liste mit den zweiten Kriterien liefern, um die average.I zu berechnen hoffe, es ist klar, – George

Verwandte Themen