gpt4 book ai didi

python - 在 __add__ 运算符中返回相同子类的对象

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:28 25 4
gpt4 key购买 nike

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

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类型。我如何在返回与 f1 和 f2 相同的类型的 Number 父类(super class)中只定义一次加运算符?我必须使用 isinstance 吗?有没有更简洁的方法来做到这一点?

谢谢!

最佳答案

你可以用 __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)

关于python - 在 __add__ 运算符中返回相同子类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16750016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com