Duncan Booth wrote: > Alex Martelli wrote: > > >>>What I think I'm trying to get at is that I believe that most >>>situations where someone actually tries to do something in the base >>>initialiser which requires calling a virtual method are probably also >>>cases where the initialiser is doing too much: i.e. separating the >>>construction/initialisation from actually doing something is usually >>>a good idea. >> >>But why should that be? Template Method is perhaps the MOST generally >>useful design pattern -- why would it be any less useful in >>initialization than elsewhere?! >> > > Because it is error prone?
Programming *is* error prone. > Any method which is called from the constructor/initialiser has to operate > correctly any method has to operate correctly anyway !-) > on an object which at that point is not fully > constructed/initialised. In Python, when the __init__ method is called, the object is at least fully constructed. > So instead of having to write a method on a Foo > object, your template method has to operate on a partial Foo. The danger is > that you haven't clearly defined the partial Foo interface sufficiently and > the method tries to use other parts of the object which haven't yet been > set up. If so, the worse thing that can happen is an exception - and you'll surely spot the problem really soon. > That situation gets worse when you have a class hierarchy as the > subclass needs to know that it has to do complete its own initialisation > before constructing the base class instead of afterwards, and if you are > going to document that requirement, why not do it properly and split the > construction in two? It's *already* split : __new__ construct the object, __init__ initialize it. > That's why I would go for the 2-phase construction: But that's already what you have. > after the first phase > you have an object which is fully initialised, just not yet > used/connected/running. For example httplib.HTTPConnection does this: you > construct the object with a host and port, but the actual connection is > triggered by a separate object. If you look at file objects, they do try and open the file at init time. Is a net or db connection that different ? (snip) -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list