[Tutor] Is this a good idea?
Kent Johnson
kent37 at tds.net
Tue Jun 5 14:43:59 CEST 2007
Carlos wrote:
> Hello,
>
> I'm trying to generate two classes, one of them is a given object and
> the other is a 'factory' of those objects. I'm doing this because I'm
> working with huge amounts of objects and would like to have a loop
> generating them. The problem is that I fear that my understanding of OOP
> is just not good enough. So what do you say, is this a good way to solve
> this??
>
> class objct:
>
> def __init__(self, name, val):
> self.name = name
> self.val = val
> class collection:
This indent is funny; I assume this is a top-level class, not a nested
class...
>
> def __init__(self, objcts):
> objecList = []
>
> for i in range(objcts):
> instance = 'myInst%i' %(i)
> objecList.append(instance)
>
> for i in range(objcts):
> i = objct(objecList[i], i)
> print i.name
> print i.val
> myC = collection(10)
The idea is OK but the implementation is flawed. collection() can be a
standalone factory function, it doesn't have to be a class. (You could
make it a staticmethod if you want it to be enclosed in the objct
namespace.)
Note that objecList is a list of instance names, not a list of objct
instances. The objcts you create in the second loop are just thrown
away. Actually objecList is also thrown away since it is never assigned
to an instance variable; myC refers to an instance of collection but it
has no instance data.
If you want to create a list of objcts you can do this in a single list
comprehension:
myC = [ objct('myInst%i' %(i), i) for i in range(objcts) ]
You could put this in a collection() function if you like. I would write
your example as
class objct:
def __init__(self, name, val):
self.name = name
self.val = val
def objct_collection(num):
return [ objct('myInst%i' %(i), i) for i in range(num) ]
I hope the real code uses more descriptive names than objct and
collection...
Kent
More information about the Tutor
mailing list