Paweł
Paweł

Reputation: 67

Implementing new data type in Python - without classes

I'm trying to implement new data type "Fractions" in Python to represents fractions, where numenator and denominator are both integers. Moreover, I have to implement four basic arithmetic operations. The trick is, I can't use classes in this task. I thoght maybe tuples can be a good idea but I really don't know how to approach this. Is there an easy way to solve such a problem? Any hint would really help me.

Upvotes: 0

Views: 64

Answers (2)

Acccumulation
Acccumulation

Reputation: 3591

If you want to troll your teacher, you could do something along the lines of:

def construct(values):
    def mul(other_fraction):
        new_numerator = values['numerator']*other_fraction['values']['numerator']
        new_denominator = values['denominator']*other_fraction['values']['denominator']
        new_values = {'numerator':new_numerator,'denominator':new_denominator}
        return(construct(new_values))
    return({'values':{'numerator':values['numerator'],'denominator':values['denominator']},'mul':mul})

This allows you to construct objects that contain a mul function that acts much like a class method:

x = construct({'numerator':1,'denominator':2})
y = construct({'numerator':3,'denominator':5})   
product = x['mul'](y)
print(product['values']['numerator'],product['values']['denominator'])
>>3 10

Upvotes: 1

Robᵩ
Robᵩ

Reputation: 168796

You have two problems. 1) How to encapsulate the data, and 2) How to operate on the data.

First, let's solve encapsulation. Just put everything you need in a tuple:

half = (1,2)
whole = (1,1)
answer = (42,1)

See? The first item is the numerator, the second is the denominator.

Now you need a way to operate on the data. Since we can't use methods, we'll just use regular functions:

def mul(a,b):
    'Multiply two fractions'
    return (a[0]*b[0], a[1]*b[1])

Similarly, implement add(a,b), negate(a), sub(a,b), etc. You might need a simplify(), so you don't end up with 10240000/20480000 after a while.

To make our object-oriented-without-classes suite complete, we need a constructor:

def make_frac(num, denom):
    'Create a fraction with the indicated numerate and denominator'
    return (num, denom)

Finally, place all of these functions in a module, and your task is complete. The user of your library will write something like this:

import your_fraction_lib

half = your_fraction_lib.make_frac(1,2)
quarter = your_fraction_lib.mul(half, half)
three_quaters = your_fraction_lib.add(half, quarter)

Upvotes: 2

Related Questions