Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > __init__ vs __new__

Reply
Thread Tools

__init__ vs __new__

 
 
Daniel Klein
Guest
Posts: n/a
 
      01-11-2007
I've have a program that is using both of the methods below (in
different classes of course) for initializing the class. The example
below shows a class with the 2 methods with one commented out.

class JsubroutineParameters(list):
"Represents a list of arguments for external subroutine calls."
# We only need to override methods which add objects to the list.

def __init__(self, alist = []):
for objekt in alist: _validateParameter(objekt)
self.extend(alist)

#def __new__(cls, alist = []):
# for objekt in alist: _validateParameter(objekt)
# return list.__new__(cls, alist)

I don't really notice any behavioral difference. Is there in fact any
difference in using one over the other? Performance? Side effects? ???

I am using Python version 2.5.

Thanks,
Daniel Klein
 
Reply With Quote
 
 
 
 
Neil Cerutti
Guest
Posts: n/a
 
      01-11-2007
On 2007-01-11, Daniel Klein <(E-Mail Removed)> wrote:
> I've have a program that is using both of the methods below (in
> different classes of course) for initializing the class. The
> example below shows a class with the 2 methods with one
> commented out.
>
> class JsubroutineParameters(list):
> "Represents a list of arguments for external subroutine calls."
> # We only need to override methods which add objects to the list.
>
> def __init__(self, alist = []):
> for objekt in alist: _validateParameter(objekt)
> self.extend(alist)
>
> #def __new__(cls, alist = []):
> # for objekt in alist: _validateParameter(objekt)
> # return list.__new__(cls, alist)
>
> I don't really notice any behavioral difference. Is there in
> fact any difference in using one over the other? Performance?
> Side effects? ???
>
> I am using Python version 2.5.


The second version doesn't work the way you might be assuming.

Guido's paper says that mutable builtins like list have a dummy
__new__ static method. So 'return list.__new__(cls, alist)' does
nothing. It seems to work because the base class __init__
performs the initialization (assuming your __init__ above is
commented out). You can see this by providing a dummy __init__.

class Example(list):
def __new__(cls, alist):
return list.__new__(cls, alist)
def __init__(self, alist):
pass

>>> a = Example(range(5))
>>> a

[]

There is no need to use __new__ for mutable builtin types. Since
all you want from this construction is a side-effect, you can
nevertheless use it in this case.

Your __init__ should call the base-class __init__.

It's usually a bad idea to provide mutable types as default
arguments. Since you aren't modifying alist in __init__ you can
get away with it here, but getting in the habit of using the
below idiom might save you from a "gotcha" someday.

class JsubroutineParameters(list):
def __init__(self, alist=None):
if alist is None:
alist = []
for objekt in alist: _validateParameter(objekt)
list.__init__(self, alist)

You will no longer need to call append.

--
Neil Cerutti
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Modify arguments between __new__ and __init__ Steven D'Aprano Python 4 12-23-2007 12:01 PM
__new__, __init__ and pickle Edward C. Jones Python 0 06-30-2005 03:54 AM
Can __new__ prevent __init__ from being called? Felix Wiemann Python 9 02-16-2005 09:47 PM
__new__ does not call __init__ as described in descrintro.html (WAS:Can __new__ prevent __init__ from being called?) Steven Bethard Python 2 02-16-2005 06:50 AM
newbie question, what's the difference between built-in functions "__new__" and "__init__" chenyu Python 1 11-07-2003 08:25 AM



Advertisments