我现在正在book工作,我对exercises(#6)之一有疑问。
所以我们有一个手工制作的Fraction
类,除了所有其他类型的东西,我们想要比较两个分数。
class Fraction:
def __init__(self, num, den):
if not (isinstance(num, int) and isinstance(den, int)):
raise ValueError('Got non-int argument')
if den == 0:
raise ValueError('Got 0 denominator')
self.num = num
self.den = den
# some class methods
def __lt__(self, other):
selfnum = self.num * other.den
othernum = other.num * self.den
return selfnum < othernum
# some class methods
# trying it out
x = Fraction(1, -2)
y = Fraction(1, 3)
但是,当我们评估x < y
时,结果为False
。我想要制作新的属性来存储符号,但这会让一切都搞砸了。
由于缺乏更好的替代方案,我在方法中添加了if
,这就是我得到的内容
def __lt__(self, other):
selfnum = self.num * other.den
othernum = other.num * self.den
if self.den * other.den > 0:
return selfnum < othernum
else:
return selfnum > othernum
虽然它似乎有效,但我想知道,如果有更优雅的解决方案。
更新 存储登录分子做我想要的(我可以改变2行而不是在每种方法中添加条件)。
答案 0 :(得分:2)
如果您假设两个分母都是正数,则可以安全地进行比较(因为a/b < c/d
意味着ad < bc
)。我只想将符号存储在分子中:
self.num = abs(num) * (1 if num / den > 0 else -1)
self.den = abs(den)
或者:
self.num = num
self.den = den
if self.den < 0:
self.num = -self.num
self.den = -self.den
您的__lt__
方法可以是:
def __lt__(self, other):
return self.num * other.den < other.num * self.den