Reverse engineering

You can figure out a lot about a class given an example of its use. From the sample output of using our imagined Fraction class we can tell that:

>>> d1 = Fraction(2,5)
>>> print(d1)
2/5

→ It will have a constructor that takes two arguments, the first one the numerator, the second the denominator.

>>> print(d1)

→ It defines a __str__ method for display.

>>> d2 = Fraction(4)`
4/1

→ The constructor can handle getting a single number. It does so by using it as the numerator and 1 as the denominator of the Fraction it constructs.

>>> d3 = d1 + d2

→ It defines the __add__ function.

>>> if d1 <= d2:

→ It defines the __le__ method.

>>> print(d1[0], d1[1])

→ It defines the __getitem__ method.

>>> print(d1 + 2)

→ Its __add__ method works when the second argument is an integer and not another Fraction.

>>> print(d1 - 2)

→ It defines __sub__ and like __add____sub__ works with integer values as well as Fraction values.