[Tutor] How to introduce OO?

Kirby Urner urnerk@qwest.net
Thu, 06 Dec 2001 08:14:15 -0800

> > Perhaps I asked the wrong question.  If all I want is to use
> > Python for a scripting language and some simple programs,
> > is OOP perhaps overkill?

At 02:41 PM 12/6/2001 +0000, alan.gauld@bt.com replied:


I like to introduce Python's OO with operator overriding,
as here's something you can do with objects that you
simply cannot do procedurally.

Suppose I want numbers that, when multiplied together,
return a*b mod n, i.e. the remainder of the product a*b,
after being divided by some modulus n.

   class Modno:

         def __init__(self,val,mod):
            self.value = val
            self.mod = mod

         def __mul__(self,other):
            product = (self.value * other.value) % self.mod
            return Modno(product,self.mod)

        def __repr__(self):
            return str(self.value)

  >>> from play import Modno

  >>> a = Modno(4,5)
  >>> b = Modno(3,5)
  >>> a*b
  >>> c=a*b       # a*b returns a Modno, usable right away
  >>> c*c*c*c     # using c, a Modno, returned by a*b

Of course you can write a modmul procedure that takes
ordinary integers a,b and returns the product mod some
global n.  But you don't get to use * (multiplication
symbol) as a binary operator.

I then enhance the above class with __add__ which works
the same way:  returns (a + b) mod n.  Then add a __pow__
so you can exponentiate c (c**4 instead of c*c*c*c).
Then add __div__...  lotsa fun.

More code to ensure val<mod, only integers, a,b have
same mod before multiplying etc. etc. is optional.

None of this is entirely trivial in the sense of "without
application".  Learning some modular arithmetic is a
good intro to elementary group and number theory, and
an entre into cryptography.  I pursue these topics, with
Python, here: http://www.inetarena.com/~pdx4d/ocn/crypto0.html