[Tutor] class attribute to initiate more classes

Dave Angel davea at ieee.org
Sat Oct 31 12:55:12 CET 2009

Vincent Davis wrote:
> I have a program that generates many instances of a class with an attribute
> self.x = random.gauss(10, 2). So each instance has a different value for
> self.x. This is what I want. Now I want to make a class that starts my
> program and sets the attributes.
> class people:
>     def __init__(self, size)
>         self.size = size
> class makepeople:
>     def __init__(self, randomsize)
>         self.rsize = randomsize
>         self.allpeople = []
>     def makethem():
>         for x in range(1,100):
>             p+str(x) = people(self.rsize)
>             allpeople.append(p+str(x))
> so what I would like to have work is set the attribute of makepeople so that
> when it is used to make instances of people each will have a different size.
> listofp = makepeople(random.guass(100, 2))
> listofp.makethem()
> I would then what listofp.allpeople to be a list of people with different
> sizes. The above code does not work, I don't think it does anyway.
> I hope this makes sense, I am sure there is a term for what I am trying to
> do but I don't know it.
> Thanks
> Vincent Davis
You're trying to do several things here, and I'm unclear on many of the 
details.  So here's a new spec, and the implementation for it.

We want a factory class, which can be given a particular distribution 
function and parameters, and using those parameters generate a list of 
Person objects, whose heights are distributed according to that random 
function.  There might be duplicates in that list, but they'd be random 
coincidence, and the list as a whole would be as random as the function 
specified by the caller.

I also took a few liberties on the names of things, trying to use Python 
conventions for naming, and things like using a singular word for a 
classname of a single item.  And I removed the allpeople attribute, as 
the class only makes sense to me if you can use its instance multiple 
times, to generate more items with the same given distribution.

import random, functools

class Person:
    def __init__(self, size):
        self.size = size
    def __str__(self):
        return "Person of size %s" % self.size

class MakePeople:
    def __init__(self, random_func):
        self.random_func = random_func

    def make_them(self, count):
        return [Person(self.random_func()) for i in xrange(count)]

people_maker = MakePeople(functools.partial(random.gauss, 100, 2))
persons = people_maker.make_them(100)
for person in persons:
    print person



More information about the Tutor mailing list