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