在Python中让重载操作符抛出错误可以吗?

avkwfej4  于 2023-10-14  发布在  Python
关注(0)|答案(1)|浏览(85)

我正在做一个研究项目。我写了一个名为point的类,它重载了比较运算符(<、>、<=和<=)。我还有另一个类,叫做reflection,它对点执行某些操作。但是,有时反射会返回一个无法比较的点。下面是我正在使用的代码的概要。

class Point:
    def init__(self, values):
        self.values = values
        self.definite = True

    def __gt__(self, other):
        if not self.definite or not other.definite:
            raise ValueError("Points are not Definite!")
        # Implementation details

    def __lt__(self, other):
        if not self.definite or not other.definite:
            raise ValueError("Points are not Definite!")
        # Implementation details

    def makeDefinite(self):
        # Add code to give the point definite values.
        self.definite = True
        return

class Reflection:
    def __init__(self, i, j):
        self.i = i
        self.j = j

    def execute(self, point):
        # This method performs the designated reflection to the point. If j = 0, the point becomes indefinite
        if self.j == 0:
            point.definite = False
        #  Implementation details

我可以提出这样的错误吗?如果没有,我如何才能实现相同的功能而不引发错误?需要注意的是,makeDefinite方法只能在特定时间调用。

lokaqttq

lokaqttq1#

是的,在实现数值类型时引发异常是正常的。通常最好匹配标准类型的操作。例如1/0引发ZeroDivisionError,如果你的类中有类似的情况,那么同样的事情也应该被引发。
这是“通常”。您可能希望这些操作符的语义表现不同。例如,在pathlib.Path中,除法实际上是子路径的连接。
有一点值得注意。在模拟数值类型中,当一个运算符的类型不支持该运算时,建议使用一个return NotImplemented。这是因为Python可能会尝试多个operator方法调用来让一个操作工作-可能int不理解你的类,但你的类理解int。因此,反向操作可能有效。如果所有的尝试都失败了,Python就会为你抛出一个TypeError

相关问题