设计模式 - 两种不同的返回类型

时间:2016-02-16 22:50:29

标签: python design-patterns

我的讲师要求我们用Python编写一些代码。我们的想法是 - 我们以文本形式向我们的类提供数字,它返回一个整数或浮点类型的数字。

示例:

输入:"二百零一个"

输出:201(整数)

输入:"两点六"

输出:2.6(浮动)

他还要求我们使用"合适的设计模式"。我知道如何编写算法,但我不知道我应该使用哪种设计模式,所以我可以管理多种返回类型。我可能听起来很无知,我的解释很模糊,但你必须知道我们没有对这个主题进行过任何介绍,而且我们几乎都是靠自己的。

编辑 - 到目前为止我所拥有的:

class NumberInterpreter(object):
   #number_in_string is a number in text form like 'two hundred'
   def __init__(self, number_in_string):
       #contains word lists
       .
       .
       .

   def return_int_number(self):
       #used if number is an integer
       #returns number as integer
       .
       .
       .
       return integer_number

   def return_float_number(self):
       #not implemented
       .
       .
       .
       return float_number

很遗憾,我现在无法访问我的整个代码,但我会感谢任何建议。

1 个答案:

答案 0 :(得分:1)

这看起来像CatalogStrategy

有关更多模式,请参阅Python Patterns(滚动到页面的下半部分)。

你必须在“点”之后处理多个数字,即“两点六七”吗?

编辑:我会将其归类为“带有自动选择的CatalogStatic”

class NumberParser:
    def __init__(self, parse_type=None):
        try:
            self.parse = self._parse_types[parse_type]
        except KeyError:
            raise ValueError("invalid parse_type '{}'".format(parse_type))

    @staticmethod
    def _parse_int(str_i):
        """
        Parse `str_i` as an integer
        """
        return 1

    @staticmethod
    def _parse_float(str_f):
        """
        Parse `str_f` as a float
        """
        return 1.

    @staticmethod
    def _parse_auto(str_a):
        """
        Parse `str_a` as int if possible, else as float
        """
        if "point" in str_a:
            return NumberParser._parse_float(str_a)
        else:
            return NumberParser._parse_int(str_a)

    # needs .__func__ on each to work around
    #   static method's need for a calling class
    _parse_types = {
        int:     _parse_int.__func__,
        "int":   _parse_int.__func__,
        float:   _parse_float.__func__,
        "float": _parse_float.__func__,
        None:    _parse_auto.__func__
    }

调度可以作为

进行测试
import unittest

class TestNumberParser(unittest.TestCase):
    def test_fp_type_i(self):
        self.assertEqual(NumberParser(float).parse("eight"), 1.)

    def test_fp_type_f(self):
        self.assertEqual(NumberParser(float).parse("eight point one"), 1.)

    def test_fp_str_i(self):
        self.assertEqual(NumberParser("float").parse("eight"), 1.)

    def test_fp_str_f(self):
        self.assertEqual(NumberParser("float").parse("eight point one"), 1.)

    def test_ip_type_i(self):
        self.assertEqual(NumberParser(int).parse("eight"), 1)

    def test_ip_type_f(self):
        self.assertEqual(NumberParser(int).parse("eight point one"), 1)

    def test_ip_str_i(self):
        self.assertEqual(NumberParser("int").parse("eight"), 1)

    def test_ip_str_f(self):
        self.assertEqual(NumberParser("int").parse("eight point one"), 1)

    def test_ap_i(self):
        self.assertEqual(NumberParser().parse("eight"), 1)

    def test_ap_f(self):
        self.assertEqual(NumberParser().parse("eight point one"), 1.)

if __name__ == "__main__":
    unittest.main()