On 7/13/06, Christian Theune <[EMAIL PROTECTED]> wrote:
Chris S wrote:
> I'm trying to adopt some code to use ZODB as its persistence level.
> I've read the "Writing a Persistent Class" article
> but how do you persist a class that already inherits another class?
> Does ZODB work with multiple inheritence?


> Also, how should I persist
> objects in libraries beyond my control? For example, I'd like to
> persist instances of pyrobot.brain.conx.Network
> (http://pyrorobotics.org/?page=Building_20Neural_20Networks_20using_20Conx).
> Is there any ability in ZODB to retroactively wrap objects in a
> persistence mechanism instead of having to rewrite an entire library
> to use the Persistent class?

You can always persist (almost) any object, even if it does not subclass
from Persistent. However, any changes to the object will not be detected
automatically and you would have to either a) reassign the object to the
ZODB or b) mark it as changed using _p_changed()


I don't think this is the case. Consider my simple example below. None
of my classes inherit Persistent, and even though I set _p_changed =
1, nothing's persisted.

from UserDict import UserDict as dict

from ZODB import FileStorage, DB
import transaction

class User(object):
   def __init__(self, name):
       self.name = name
       self.children = dict()

storage = FileStorage.FileStorage('test.db')
db = DB(storage)
conn = db.open()
root = conn.root()

import random
parentName = 'bob'
parent = root.get(parentName, User(parentName))
print 'before:',parent.children.keys()
for n in xrange(10):
   childName = random.randint(1,100)
   parent.children[childName] = User(childName)
parent._p_changed = 1
parent.children._p_changed = 1
print 'after:',parent.children.keys()

For more information about ZODB, see the ZODB Wiki:

ZODB-Dev mailing list  -  ZODB-Dev@zope.org

Reply via email to