It might be worth mentioning that i was originally doing this inside
the factory loop with the same issue:
name = sName.capitalize() + sType.capitalize() + 'Shape'
##This is really what needs to happen anyways to since the
method will be passed a 'self' arg
assignmentFunc = lambda self: fnc()
result[name] = type(name, (Shape,),
{'shapeFunc':assignmentFunc})
In the end, I end up with something like this:
>>> id(result['class1']) != id(result['class2'])
True
>>> id(result['Class1'].shapeFunc) == id(result['Class2'].shapeFunc)
True
hrm...
On Jan 14, 5:15 pm, John Patrick <[email protected]> wrote:
> Hey all,
>
> I've been looking at this for quite a while, and I still can't figure it
> out. I'm trying to write a class factory that generates 'Shape' subclasses,
> each of which has a different 'shapeFunc' attribute that creates a shape.
> The problem I'm running into is that all the classes come out with the same
> function - the last one in the list. So it looks like I'm somehow creating
> a reference to the same object in all the classes...but I'm not sure why.
>
> I have a number of 'make_someShapeName_crv' functions in the same module,
> and I'm trying to get a dictionary of all the classes like this:
>
> def genShapeClasses():
> """
> A factory that generates shape creation classes
>
> @return: a dict of {'className': class}
> """
> result = {}
>
> fncs = inspect.getmembers(sys.modules[__name__], inspect.isfunction)
> fncs = [(name, fnc) for name, fnc in fncs if name.startswith('make_')]
>
> for fName, fnc in fncs:
> tmp, sName, sType = fName.split('_')
>
> #debugging log
> msg = "Generating Shape Class:\n"
> msg += "name: %s\n" % sName
> msg += "shapeType: %s\n" % sType
> msg += "func: %s\n" % fnc.__name__
> msg += "func obj: %s\n" % str(fnc)
> msg += "fnc id: %s\n" % str(id(fnc))
> logger.debug(msg)
>
> name = sName.capitalize() + sType.capitalize() + 'Shape'
>
> result[name] = type(name, (Shape,), {'shapeFunc':fnc})
>
> Here are the last two log blocks:
>
> *# RigIt.lib.Shapes : Generating Shape Class:*
>
> *name: square*
>
> *shapeType: crv*
>
> *func: make_square_crv*
>
> *func obj: <function make_square_crv at 0x000000001827EF98>*
>
> *fnc id: 405270424*
>
> * # *
>
> *# RigIt.lib.Shapes : Generating Shape Class:*
>
> *name: text*
>
> *shapeType: crv*
>
> *func: make_text_crv*
>
> *func obj: <function make_text_crv at 0x000000001827E6D8>*
>
> *fnc id: 405268184*
>
> * #*
>
> Finally, here is the problem I'm having:
>
> >>>classes = Shapes.genShapeClasses()
> >>>print id(classes['TextCrvShape'].shapeFunc)
>
> *478555520*
>
> >>>print id(classes['SquareCrvShape'].shapeFunc)
>
> *478555520*
>
> I've tried a shotgun approach and put a deepcopy() just about everywhere to
> no avail. The thing that's stumping me is that i have a new object in
> memory when the loop starts - but somehow in the process of assigning it to
> the new class, they all end up referencing the same object. When I id() the
> class itself, they are different Class objects.
>
> Any Pythonistas out there that could offer a hand?
>
> Thanks!
>
> -JP
> --
> John Patrick
> 404-242-2675
> [email protected]http://www.canyourigit.com
--
http://groups.google.com/group/python_inside_maya