[Chandler-dev] Getting rid of all __init__ methods (for Item
subclasses)
Bryan Stearns
stearns at osafoundation.org
Thu Mar 22 10:58:55 PST 2007
Phillip J. Eby wrote:
> In discussion with Morgen, Bear, and John, we've determined that the
> optimum way to support fast dump and reload with proper support for
> multiple inheritance and type changes due to sharing, is to get rid of
> custom __init__ methods for Item subclasses.
> [...]
> The second feature is a new 'schema.initialValues()' function that you
> can call in the body of a class to define how the class' attributes
> should be initialized. For example:
>
> class ContentItem(Item):
> ...
> schema.initialValues(
> createdOn = lambda self: datetime.now()
> )
>
> In other words, keyword arguments are used for the attribute names,
> and the values are functions taking the item as an argument and
> returning the desired attribute value. The attributes are *not*
> limited to schema attributes; they can be transient attributes or even
> properties, and they override any values defined in a superclass or in
> the attribute's "initialValue" aspect. This also eliminates the need
> for __init__ to supply default values for keyword arguments or to
> change default attribute values established by base classes.
>
> The order that individual attributes will be set in is not
> guaranteeed, but they are *all* set before your __setup__ method is
> called. Any keyword arguments passed to __init__ will prevent that
> attribute value from being calculated - it'll just be set from the
> keyword before __setup__ is called.
Can you please wrap this initialization with:
with view.observersDeferred():
with view.reindexingDeferred():
# change item class here
# do initialization here
so that observers don't fire until the state of the object is
consistent? (I don't know whether disabling indexing is important, but I
don't think it'll hurt...)
...Bryan
More information about the chandler-dev
mailing list