inheritedAttribute doesn't seem to work
inheritedAttribute does not seem to work for me. The situation is summarized as follows I have the following module in a the std python path /usr/local/lib/python/site-packages/PackageA/ModuleA ModuleA defines 20 different classes, and factory methods to generate instances of these. In a zope product in zope/lib/python/Products/MyProduct I have the following in MyProduct.py from PackageA import ModuleA class MyProduct( Folder.Folder, Persistent, Implicit ): blah ( manage options, security, metatype etc) def __init__(self, id, title, name ): self.id = id self.title = title self.name = name self.dataModels = [] def addModel( self, textData ): """Add some data""" self.dataModels.append( Data( textData ) ) self._p_changed = 1 class Data: blah (security) def __init__( self, dataText ): self.dataModel = ModuleA.generateModel( dataText ) the generateModel( dataText ) is a text parser, and factory locator and caller. To get secirty settings into the 20 or so Classes in ModuleA I needed to proxy them in the product here. The model that is generated is basically a directed acyclic graph, with one top node, which is an object of type Model. The proxy object for model looks like the following class ModelProxy( ModuleA.model ): blah( security settings) def __init__( self, attributeDict, parentObject ): ModuleA.model.__init__( self, attributeDict, parentObject ) # attributeDict, parentObject are simply attributed that are passed by the text parser # to construct in this case a Model object This all works fine, and I end up with happily constructed models in the dataModels attribute of MyProduct with all nodes of the graph accessable to python scripts. But then I decided that since I opened up these models to be accessed through python scripting, i.e. the reason for the security proxy objects in the first place, then I should clean up the persistence parts so that changes to the model objects are persisted. I thought adding Persistent into the proxy objects for the 20 different kinds of classes would be sufficient, and of course ran into the "Error Value: unbound method __init__() must be called with instance as first argument" problem. To solve this I tried the following replacement for ModelProxy (and similarly for all the others) class ModelProxy( Persistent, ModuleA.model ): blah( security settings) def __init__( self, attributeDict, parentObject ): Persistent.inheritedAttribute('__init__')( self, attributeDict, parentObject ) but still got the error. I even tried class ModelProxy( Persistent, ModuleA.model ): blah( security settings) _model__init__ = ModuleA.model.__init__ def __init__( self, attributeDict, parentObject ): ModelProxy._model__init__( self, attributeDict, parentObject ) # or self._model__init__( attributeDict, parentObject ) and still got the same error. Does anyone have any ideas what may be wrong? I am also interested whether simply making the different objects(which are nodes in the DAG) persistent is enough to signal all the way back up MyProduct that self.dataModel has changed when one of the nodes deep in the graph has changed. regards Matt
Matt wrote:
Does anyone have any ideas what may be wrong?
Last saw this ages ago. Look for the ZODb documentation on ExtensionClass. Something about having to have something subclassing ExtensionClass.base (such as Persistent, IIRC) as the first thing in your list of parent classes in the class statement. Also remember inheritedAttribute playing a part...
I am also interested whether simply making the different objects(which are nodes in the DAG) persistent is enough to signal all the way back up MyProduct that self.dataModel has changed when one of the nodes deep in the graph has changed.
Provided they're attached to a persistetn object, yeah, should do. That said, you're playing with Deep ZODB voodoo by the sounds of it. Try asking on zodb-dev@zope.org. Mindyou, there's gotta be a simpler way to do what you want to do... Chris
participants (2)
-
Chris Withers -
Matt