我的讲师要求我们用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
很遗憾,我现在无法访问我的整个代码,但我会感谢任何建议。
答案 0 :(得分:1)
有关更多模式,请参阅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()