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