On Wed, 30 Mar 2005, Kevin wrote:

> I was wondering, can you make a program the uses alot of classes do the
> exact same thing with out useing classes?

Hi Kevin,


Yes.  We can even do a lot of object oriented programming without classes,
although it might be slightly painful.


You asked an earlier question about constructors, so I'll try to flesh
that out too.  Let's use a small toy example.

If we have a Person class:

######
class Person:
    def __init__(self, name):
        self.name = name
        self.friends = []

    def addFriend(self, otherPerson):
        self.friends.append(otherPerson)

    def sayHelloToAll(self):
        for friend in self.friends:
            print "hi", friend.name, "it is I,", self.name
######

then we can just play with it:


######
>>> alan = Person("alan")
>>> tim = Person("tim")
>>> alan.addFriend(tim)
>>> alan.sayHelloToAll()
hi tim it is I, alan
######



But we can write fairly close code that just uses functions!

######
def makePerson():
    return {'name': None,
            'friends' : None}

def initPerson(self, name):
    self['name'] = name
    self['friends'] = []

def addFriend(self, otherPerson):
    self['friends'].append(otherPerson)

def sayHelloToAll(self):
    for friend in self['friends']:
        print "hi", friend['name'], "it is I,", self['name']
######



Let's see how this might work:

######
>>> (kevin, danny, sean) = (makePerson(), makePerson(), makePerson())
>>> initPerson(kevin, "Kevin")
>>> initPerson(danny, "Danny")
>>> initPerson(sean, "Sean")
>>> addFriend(kevin, danny)
>>> addFriend(kevin, sean)
>>> sayHelloToAll(kevin)
hi Danny it is I, Kevin
hi Sean it is I, Kevin
######

What's different here from the code with the explicit 'class' stuff is
only mere appearance.  Syntactially, it has the appearance of:

    verb(subject, object)

If we were to use classes, things would look more like:

    subject.verb(object)

which some people prefer to read.


But it's a bit clunky to do this all by hand.  As a concrete example,
Python's class support automatically does stuff like makePerson() for us:
we just have to write an appropriate initializer to shape the object the
way we want.  When we do something like this with Classes:

######
personUsingClasses = Person("Kevin")
######

we are actually doing two things: we first "construct" an object, and then
we "initialize" it to fill the object in.

In the function code above, we can see these two steps:

######
personUsingFunctions = makePerson()
initPerson(personUsingFunctions, "Kevin")
######

It's a common idiom to do construct-and-init, since an uninitialized
object is pretty useless, so Python's class support always does
construction for us.  This allows us to concentrate on the part that's
really important to us --- the initializer.


If we use Python's class support, stuff like this tends to be briefer and
easier to read.  So a little bit of Python's class support is syntax to
make it nicer to write code that focuses on "objects".

Does this make sense so far?

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to