5

我正在为自己的解释器开发一个简单的类型系统。我正在写这样的东西:

class Base(object):
    def __init__(self, content):
        self.__content = content

    @property
    def content(self):
        return self.__content

    @content.setter
    def content(self, value):
        self.__content = value

class Number(Base):
    def __init__(self, content):
        super(Number, self).__init__(content)

    def __add__(self, other):
        return Number(self.content + other.content)

    ...and so on

class Float(Number):
    def __init__(self, content):
        super(Float, self).__init__(content)

class Integer(Number):
    def __init__(self, content):
        super(Integer, self).__init__(content)

我的问题是,显然如果我做这样的事情:

if __name__ == '__main__':
    f1 = Float(3.5)
    f2 = Float(2.3)
    f3 = f1 + f2
    type(f3)

我已经将f1和f2相加,它们是Float类型,但是我得到了f3,它是Number类型,但我希望f3是Float类型。如何在 Number 超类中定义一次 add 运算符,返回一个与 f1 和 f2 相同的类型?我必须使用 isinstance 吗?有没有更清洁的方法来做到这一点?

谢谢!

4

1 回答 1

8

你可以做一些事情__class__

def __add__(self, other):
    return self.__class__(self.content + other.content)

正如@Eric 指出的那样,您可能想要做类似的事情

if self.__class__ == other.__class__:
    <use __class__>
else:
    <use Number>

以确保可预测的行为(或如果类不匹配,则采取其他行动)。

__radd__在这里也值得覆盖:

__radd__ = __add__

这将使Number(1) + Float(1) == Float(1) + Number(1) == Float(2)

于 2013-05-25T13:29:42.417 回答