title: Why I receive a type error?
body: <p>My code below:</p>
  
  <pre><code>class Fraction:
  """Class for performing fraction arithmetic.
  Each Fraction has two attributes: a numerator, n and a deconominator, d.
  Both must be integer and the deonominator cannot be zero."""
  
  def __init__(self, n , d):
      """Performs error checking and standardises to ensure denominator is positive"""
      if type(n)!=int or type(d)!=int:
          raise TypeError("n and d must be integers")
      if d==0:
          raise ValueError("d must be positive")
      elif d&lt;0:
          self.n = -n
          self.d = -d
      else:
          self.n = n
          self.d = d
  
  def __str__(self):
      """Gives string representation of Fraction (so we can use print)"""
      return(str(self.n) + "/" + str(self.d))
  
  def __add__(self, otherFrac):
      """Produces new Fraction for the sum of two Fractions"""
      newN = self.n*otherFrac.d + self.d*otherFrac.n
      newD = self.d*otherFrac.d
      newFrac = Fraction(newN, newD)
      return(newFrac)
  
  def __sub__(self, otherFrac):
      """Produces new Fraction for the difference between two Fractions"""        
      newN = self.n*otherFrac.d - self.d*otherFrac.n
      newD = self.d*otherFrac.d
      newFrac = Fraction(newN, newD)
      return(newFrac)
  
  def __mul__(self, otherFrac):
      """Produces new Fraction for the product of two Fractions"""        
      newN = self.n*otherFrac.n
      newD = self.d*otherFrac.d
      newFrac = Fraction(newN, newD)
      return(newFrac)
  
  def __truediv__(self, otherFrac):
      """Produces new Fraction for the quotient of two Fractions"""        
      newN = self.n*otherFrac.d
      newD = self.d*otherFrac.n
      newFrac = Fraction(newN, newD)
      return(newFrac)
  
  def __eq__(self, otherFrac):
      return(self.n * otherFrac.d) == (self.d * otherFrac.n)
  
  def gcd(self):
      gcd = 1
      if self.n % self.d == 0:
          return self.d
      for k in range(int(self.d / 2), 0, -1):
          if self.n % k == 0 and self.d % k == 0:
              gcd = k
              break
      return gcd
  
  def simFrac(self):
      newN = self.n / f.gcd()
      newD = self.d / f.gcd()
      newFrac = Fraction(newN, newD)
      return (newFrac)
  </code></pre>
  
  <p>When I try to run the progress of simFrac() there is an error coming out from the system.</p>
  
  <p>This is my test:</p>
  
  <pre><code>f=Fraction(30,18)
  f.gcd()
  6 #The output of f.gcd()
  </code></pre>
  
  <p>And we I try to type f.simFrac()</p>
  
  <p>it come out with a error look like:</p>
  
  <pre><code>Traceback (most recent call last):
    File "&lt;pyshell#6&gt;", line 1, in &lt;module&gt;
      f.simFrac()
    File "C:/Users/Kavan/Documents/Python/resit CE/Q4.py", line 67, in simFrac
      newFrac = Fraction(newN, newD)
    File "C:/Users/Kavan/Documents/Python/resit CE/Q4.py", line 9, in __init__
      raise TypeError("n and d must be integers")
  TypeError: n and d must be integers
  </code></pre>
  
  <p>I know there is an error about the integer from the fuction(simFrac), but I not sure how to solve it, can anyone show me how to do it?</p>