2016-09-29 5 views
1

Ich habe eine Factory-Klasse namens FitFunction erstellt, die eine ganze Reihe von Sachen über das hinaus, was ich gezeigt habe. Die Label-Methode pretty_string soll den String einfach wie geschrieben zurückgeben. Wenn ich diese Datei ausführe, druckt sie eine Zeichenfolge, die so nützlich ist wie die repr. Weiß jemand, wie ich das umsetzen würde?Factory-Klasse mit Abstract-Methode

#!/usr/bin/env python 

from __future__ import print_function, absolute_import 

import abc 
import types 
import numpy as np 

class FitFunction(object): 

    def __init__(self, python_function): 

     assert isinstance(python_function, types.FunctionType) 
     self._py_function = python_function 

    @abc.abstractmethod 
    def pretty_string(): 
     r""" 
     Return some pretty string. 
     """ 


class Gaussian(FitFunction): 


    def __init__(self): 

     def gaussian(x, mu, sigma, A): 
      coeff = (_np.sqrt(2.0 * _np.pi) * sigma)**(-1.0) 
      arg = -.5 * (((x - mu)/sigma)**2.0) 
      return A * coeff * _np.exp(arg) 

     FitFunction.__init__(self, gaussian) 

     @staticmethod 
     def pretty_string(): 
      return "1D Gaussian" 


if __name__ == "__main__": 

    print("Gaussian.pretty_string: %s" % Gaussian().pretty_string()) 

ich Unterklasse FitFunctionGaussian zu schaffen, weil ich Gaussian zu vielen verschiedenen Datensätze mit den gleichen Parametern anwenden, so dass ich die Ausgabe vergleichen.

Als Referenz ist das, was passiert, wenn ich die Datei ausführen:

me$ ./FitFunction_SO_test.py 
Gaussian.pretty_string: <bound method Gaussian.pretty_string of <__main__.Gaussian object at 0x1005e2f90>> 

Ich bin für das folgende Ergebnis der Suche:

me$ ./FitFunction_SO_test.py 
Traceback (most recent call last): 
    File "./FitFunction_SO_test.py", line 43, in <module> 
    print("Gaussian.pretty_string: %s" % Gaussian().pretty_string()) 
TypeError: pretty_string() takes no arguments (1 given) 
+0

Ihre Einrückung ist in der 'Gaussian'-Klasse nicht korrekt, daher wird' pretty_string' als lokale Variable in der Methode '__init__' definiert. Stellen Sie sicher, dass '' staticmethod'' und 'def' mit' def' für '_init__', nicht mit' def' für die innere Funktion ausgerichtet sind. – Blckknght

Antwort

0

Verwendung:

print("Gaussian.pretty_string: %s" % Gaussian.pretty_string()) 

Or sonst druckst du die repr der Methode, nicht das Ergebnis des Aufrufs der Methode, die die Zeichenfolge ist, die Sie suchen.

+0

Das gibt nur keine zurück. Es löst das Problem nicht. – blalterman

+0

@blalterman Huh? Was gibt 'None' zurück? Es druckt 'None'? Es funktioniert für mich. Es druckt 'Gaussian.pretty_string: 1D Gaussian' auf Python 2.7.12. –

0

Ich bin mir nicht sicher, ob dies Ihr Problem beheben wird, da ich es jetzt nicht selbst überprüfen kann, aber Sie sollten wahrscheinlich @abc.abstractstaticmethod verwenden (und das self Argument offensichtlich loswerden), um die Basisklassenmethode zu dekorieren. Wenn das nicht behoben wird, lösche ich diese Antwort später. Wenn es repariert wird, werde ich das in eine bessere Antwort bearbeiten.

+0

Ja, ich musste mich selbst loswerden. Aber das ist nur ein Teil des Problems. Siehe die Änderungen. – blalterman

+0

Immer noch ziemlich sicher, dass Sie '@ abstractstaticmethod' anstelle von' @ abstractmethod' verwenden müssen. Hast du das probiert? –

+0

'abstractstaticmethod' ist in meiner Version von' abc' nicht vorhanden. Es ist wahrscheinlich erwähnenswert, dass ich auf Python 2.7 bin. – blalterman