2016-09-29 104 views
1

我創建了一個名爲FitFunction的工廠類,它增加了一大堆超出我所示範圍的內容。標籤方法pretty_string應該只是以書面形式返回字符串。當我運行這個文件時,它會打印一個和repr一樣有用的字符串。有人知道我會如何去實施這個?工廠類與抽象方法

#!/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()) 

我繼承FitFunction創建Gaussian因爲我申請Gaussian許多不同的數據集使用相同的參數,這樣我可以比較的輸出。

以供參考,這是當我執行該文件會發生什麼:

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

我找了如下結果:

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

您的縮進在'Gaussian'類中是不正確的,所以'pretty_string'被定義爲'__init__'方法中的局部變量。確保'@ staticmethod'和'def'與'__init__'的'def'對齊,而不是內部函數的'def'。 – Blckknght

回答

0

用途:

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

或者否則,您正在打印方法repr,而不是調用方法的結果,這是您正在查找的字符串。

+0

那只是返回無。它不能解決問題。 – blalterman

+0

@blalterman咦?什麼返回'None'?它打印'無'?它爲我工作。它在Python 2.7.12上打印'Gaussian.pretty_string:1D Gaussian'。 –

0

我不確定這是否能解決您的問題,因爲我現在無法自己檢查它,但您應該使用@abc.abstractstaticmethod(並且明顯擺脫self參數)來裝飾基類方法。如果這不能解決它,我會稍後刪除這個答案。如果它確實解決了問題,我會將其編輯爲更好的答案。

+0

是的,我需要擺脫'self'。但這只是問題的一部分。查看編輯。 – blalterman

+0

仍然非常確定您需要使用'@ abstractstaticmethod'而不是'@ abstractmethod'。你嘗試過嗎? –

+0

我的'abc'版本中不存在'abstractstaticmethod'。可能值得注意的是我在python 2.7上。 – blalterman