工厂类与abstractmethod

时间:2016-09-29 23:45:54

标签: python abstract-factory abc

我创建了一个名为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)

2 个答案:

答案 0 :(得分:0)

使用:

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

或者您正在打印方法repr,而不是调用方法的结果,这是您要查找的字符串。< / p>

答案 1 :(得分:0)

我不确定这是否能解决您的问题,因为我现在无法自行检查,但您可能应该使用@abc.abstractstaticmethod(并明显摆脱self参数)来装饰基类方法。如果这不能解决,我会稍后删除这个答案。如果确实修复了它,我会将其编辑为更好的答案。