Python:特定类型的运算符重载

10 投票
3 回答
11259 浏览
提问于 2025-04-16 00:53

我想让我的类的操作符可以和普通类型以我定义的方式进行互动。比如说,我有:

class Mynum(object):
  def __init__(self, x):
   self.x = x
  def __add__(self, other):
   return self.x + other.x

a = Mynum(1)
b = Mynum(2)

print a+b

这段代码运行得很好,但如果我尝试这样做:

print a+2

我就会遇到错误,因为一个 int 类型并没有一个叫 x 的成员。那我该如何在类中定义 Mynumint 的相加呢?这听起来像是装饰器或 metaclass 的工作,但我对它们的用法非常不熟悉。这个问题 看起来类似,但并不完全相同。

3 个回答

3

为什么要使用额外的切换和/或异常处理呢?使用下面的方式会更简单:

class MyNum(object):
    def __init__(self, x):
        self.x = x
    def __add__(self, other):
        return other + self.x
    __radd__ = __add__
x = MyNum(5)
y = MyNum(6)
print x + 2
7
print 2 + x
7
print x + y
11
print y + x
11
5

这段代码是用来处理一些数据的。它的主要目的是从一个地方获取信息,然后对这些信息进行一些操作,最后把结果返回给我们。

首先,代码会连接到一个数据库,这就像打开一个文件夹,里面存放着我们需要的数据。接着,它会查询这个数据库,找出我们想要的信息。这一步就像在文件夹里翻找特定的文件。

找到信息后,代码会对这些数据进行处理,比如进行计算或者格式化。想象一下,你找到了一些数字,现在你需要对它们进行加减乘除的运算。

最后,处理完的数据会被返回给我们,可能是以列表的形式呈现。就像把整理好的文件放回文件夹,方便我们随时查看。

总的来说,这段代码的工作流程就是:连接数据库 -> 查询数据 -> 处理数据 -> 返回结果。

class Mynum(object):
    def __init__(self, x):
        self.x = x
    def __add__(self, other):
        try:
            return self.x + other.x
        except AttributeError:
            return self.x + other
    __radd__=__add__

a = Mynum(1)
b = Mynum(2)

print(a+b)
# 3
print(a+2)
# 3
print(2+a)
# 3
21

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,特别是当我们不太了解这些工具的工作原理时。

比如说,有人可能在使用一个特定的库时,发现它的某个功能没有按照预期工作。这时候,他们可能会去网上寻找解决方案,像在StackOverflow这样的平台上提问。

在提问时,提供清晰的信息是非常重要的。比如,描述你遇到的问题,提供相关的代码示例,以及你尝试过的解决办法。这些信息可以帮助其他人更好地理解你的问题,从而给出有效的建议。

总之,遇到问题时,不要害怕寻求帮助,记得把问题描述清楚,这样才能更快找到解决方案。

def __add__(self, other):
    if isinstance(other, self.__class__):
        return self.x + other.x
    elif isinstance(other, int):
        return self.x + other
    else:
        raise TypeError("unsupported operand type(s) for +: '{}' and '{}'").format(self.__class__, type(other))

撰写回答