【发布时间】:2019-04-25 05:31:45
【问题描述】:
我正在尝试构建一个解析数学表达式的类(我知道 SymPy,我已经尝试过,但它不适合我的用途)。
根据表达式输入,我需要返回一个不同的类。例如,我有这个:
class MyNum(MyTerm):
def __init__(self, n):
self.num = n
def latex(self):
return str(self.num)
class MyDivision(MyTerm):
def __init__(self, n, d):
self.numerator = n
self.denominator = d
def latex(self):
return '\\frac {{ {} }} {{ {} }}'.format(self.numerator, self.denominator)
def parseTerm(term):
matches = re.match(r'^[0-9]+$', term)
if matches is not None:
return MyNum(term)
matches = re.match(r'^([0-9]+)/([0-9]+)$', term)
if matches is not None:
return MyDivision(matches[1], matches[2])
所以我们有一个工厂函数parseTerm,它将返回适当的类。 parseTerm("2") 将给出一个MyNum,而parseTerm("2/3") 将给出一个MyDivision。
我根据另一个问题的建议构建了这个,该问题建议类永远不应该返回不同的函数。但是越想越不满足。每个类都将实现完全相同的面向外部的方法,剩下的问题是实现细节。在我看来,用户调用 num = MyTerm("2") 并获取合适的子类似乎是合适的,并且调用函数而不是实例化类会增加混乱。
我欢迎批评我的推理是错误的,因为我违背了建议,但我的技术问题是:我实际上该怎么做?类构造函数如何返回不同的类?
【问题讨论】:
-
我会说创建一个对象并获得其他东西会造成混乱。调用函数/方法不会。即使有可能,我也不会那样做。
-
你能分享
MyTerm的定义吗 -
当前的代码很好,你唯一可以通过复杂化获得的就是更多的错误 - 最终客户端代码仍然看起来像一个函数调用导致一些类实例。
-
我想说只实现一个
Parser类,它负责解析一个术语并返回正确的MyTerm子类就足够了。检查我的回答是否有意义@wyatt
标签: python python-3.x class