python-类构造函数可以返回子类吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-类构造函数可以返回子类吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2103字,纯文字阅读大概需要4分钟。
内容图文
![python-类构造函数可以返回子类吗?](/upload/InfoBanner/zyjiaocheng/670/76ba2cbd17824d339d3aa4f2609975ef.jpg)
我正在尝试建立一个可以解析数学表达式的类(我知道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”)并获取合适的子类,并且调用函数而不是实例化一个类会增加混乱.
由于我反对建议,因此我批评我的推理是错误的,我对此表示欢迎,但我的技术问题是:实际上我该怎么做?类构造函数如何返回不同的类?
解决方法:
__new__是可能的,但是增加的功能不值得复杂.
天真:
class MyTerm:
def __new__(cls, *args):
return parseTerm(*args)
由于创建子类对象(在ParseTerm中将调用… MyTerm .__ new__!)而失败,并出现RecursionError!
好的,让我们仅委托子类的对象:
class MyTerm:
def __new__(cls, *args):
if cls is MyTerm:
return parseTerm(*args)
return object.__new__(cls)
因为MyDivision .__ init__被调用了两次,所以它将对“ 2”有效,而不对“ 4/2”有效:
>第一次在parseTerm内部使用参数“ 4”,“ 2”
>由MyTerm .__ new__之后的Python机器第二次使用原始参数“ 4/2”
因此,您将必须允许MyDivision .__ init__接受并忽略该调用:
class MyDivision(MyTerm):
def __init__(self, n, d = None):
print(self, n, d)
if d is not None:
self.numerator = n
self.denominator = d
但这将允许MyDivision(“ 4”)…因此进行了一个新测试:
class MyDivision(MyTerm):
def __init__(self, n, d = None):
print(self, n, d)
if d is not None:
self.numerator = n
self.denominator = d
if not hasattr(self, denominator):
raise TypeError("Missing required argument")
恕我直言,这不值得…
内容总结
以上是互联网集市为您收集整理的python-类构造函数可以返回子类吗?全部内容,希望文章能够帮你解决python-类构造函数可以返回子类吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。