[Tutor] class attribute to initiate more classes
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)
> 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))
> 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.
> 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
def __init__(self, size):
self.size = size
return "Person of size %s" % self.size
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:
More information about the Tutor