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

Reply via email to