[Zope-dev] Proper Use of __init__ inside Zope Products?

Dieter Maurer dieter@handshake.de
Fri, 13 Dec 2002 23:31:23 +0100


Jeff Rush writes:
 > Can a Zope-internals guru provide some enlightenment regarding the
 > mysteries of __init__?
Are there mysteries?

I do not think so. "__init__" behaves in Zope exactly the same
as it does in Python.

It behaves differently than (most) other methods in that
its "self" is (of course) not acquisition wrapped.

 > ....
 > As I understand it, the use of __init__ should be avoided when
 > possible, since it isn't invoked (necessarily) when persistent
 > objects are reloaded from disk.
This is, as it should be.

"__init__" is only called when the object is created.
It would be wrong were it called when the object is loaded into
RAM (as this (logically) does not create the object).

 > Therefore Zope tends to do instance
 > init within manage_addMYPRODUCT global-to-Zope functions, although
 > this doesn't seem to be fully consistent throughout the Zope
 > community contributions.
It is bad style to do it this way.

The "manage_addMYPRODUCT" should not know internals about the
constructed instance.

 > The scenario is something like the following:
 > 
 > def manage_addFolder(self, id, title='', ...):
 >     instance = Folder()
 >     instance.id = str(id)
 >     instance.title = title
 >     self._setObject(id, instance)
 > 
 > class Folder(...):
 >    # no __init__ method
I do not think this is good style...



Dieter