2016-10-31 5 views
0

Я пытаюсь построить класс рациональных чисел, который будет выполнять различные арифметические функции на основе входных значений без использования модуля fractions. Когда я использую две разные фракции, код работает нормально, но как только я пытаюсь использовать целое число, я получаю ошибки в более ранних функциях класса и не знаю, почему. То, что я пытаюсь реализовать на этом этапе, - это снова добавить целое число в рациональное число (например, print Rational(1,2) * 3).Умножая числа и целые числа в Python

Я включил код, который у меня до сих пор ниже - проблемная операция __radd__, хотя, когда это включено в мой код, я получаю ошибку атрибута для __add__ (эта ошибка не появляется, пока эта новая операция не будет отображаться входит в комплект). Я предполагаю, что проблема связана с тем, что все еще имеет параметр 2 __radd__ как другой (предполагая другой случай класса Rational?), Но я не уверен, как это сделать.

Редактировать: Я использую Python 2.7. Ошибка из прогона образца включена ниже кода.

def gcd(a, b): 
    if b == 0: 
     return a 
    else: 
     return gcd(b, a%b) 
class Rational: 
    def __init__(self, nom, denom): 
     if denom == 0: 
      raise ZeroDivisionError, ("Cannot divide by zero!") 
     else: 
      self.reduce = gcd(nom, denom) 
      self.nom = nom/self.reduce 
      self.denom = denom/self.reduce 
    def __add__ (self, other): 
     return Rational(self.nom*other.denom+other.nom*self.denom, self.denom*other.denom)   
    def __sub__ (self, other): 
     return Rational(self.nom * other.denom - other.nom * self.denom,self.denom * other.denom)  
    def __mul__ (self, other): 
     return Rational(self.nom * other.nom, self.denom * other.denom) 
    def __div__ (self, other): 
     return Rational(self.nom * other.denom, self.denom * other.nom) 
    def __radd__ (self, other): 
     return Rational(self.nom*1+other*self.denom, self.denom*1) 
    def __str__ (self): 
     return str(self.nom) + "/" + str(self.denom) 

ошибка выборки

print Rational(1,2) + 1 

AttributeError       Traceback (most recent call last) 
<ipython-input-201-1ccb1fc0dfef> in <module>() 
----> 1 print Rational(1,2) + 1 

C:\Users\turk\Documents\EV_HW6_P2.py in __add__(self, other) 
    13    self.denom = denom/self.reduce 
    14  def __add__ (self, other): 
---> 15   return Rational(self.nom*other.denom+other.nom*self.denom, self.denom*other.denom) 
    16  def __sub__ (self, other): 
    17   return Rational(self.nom * other.denom - other.nom * self.denom,self.denom * other.denom) 

AttributeError: 'int' object has no attribute 'denom' 
+0

Пожалуйста, покажите полная ошибка трассировки и вызов, который приводит к этой ошибке. Вы также можете указать, используете ли вы Python 2, Python 3 или «из __future__ import division», поскольку это будет иметь здесь большое значение (или, возможно, просто используйте '//' вместо '/', предполагая, что вы нужны целые деления). – Evert

+0

Добавлено, спасибо за предложения. – turkadactyl

+0

'Rational (1,2) + 1' использует' __add__', '1 + Rational (1,2)' использует '__radd__' – furas

ответ

0

Когда Python см Rational на левой стороне +, то он использует __and__, но если нет Rational на левый размер, но он находится на правой стороне, то Python использовать __radd__. (r в названии __radd__ означает right)

В __add__ вы используете other.nom и other.denom, который не существует в int так Rational(1,2) + 1 не работает.

1 + Rational(1,2) работает, потому что в __radd__ использовании other вместо other.nom и other. denom

Вы можете использовать isinstance(other, int) распознавать int и сделать различные вычисления в __add__, и она будет работает с Rational+int и Rational+Rational

def __add__ (self, other): 
    if isinstance(other, int): 
     # Rational + int 
     return Rational(self.nom*1+other*self.denom, self.denom*1) 
    else: 
     # Rational + Rational 
     return Rational(self.nom*other.denom+other.nom*self.denom, self.denom*other.denom)   

# ---- 

print(Rational(1,2) + 1) 
print(Rational(1,2) + Rational(1,2)) 
Смежные вопросы