The constructor you'll normally override (and call when you create an object) in Python is called __init__, but there is also a method called __new__ available to the class author.
- If __new__ is defined on a class, it is called in preference to __init__
- With __new__ you return the object you have constructed, whereas with __init__ there is an implicit return of the object in the current class.
Here's a code sample showing three classes with a mixture of different constructors.
class A(object):
def __new__(cls, *args, **kwds):
print "one"
print "A.__new__", args, kwds
return object.__new__(B, *args, **kwds)
def __init__(cls, *args, **kwds):
print "two"
print "A.__init__", args, kwds
class B(object):
def __new__(cls, *args, **kwds):
print "three"
print cls
print B
print "B.__new__", args, kwds
return object.__new__(cls, *args, **kwds)
def __init__(cls, *args, **kwds):
print "four"
print "B.__init__", args, kwds
class C(object):
def __init__(cls, *args, **kwds):
print "five"
print "C.__init__", args, kwds
print C()
print "====================="
print A()
print "====================="
print B()
And here's the result of running that code:
40:~/ndfi grahamellis$ python newvinit
five
C.__init__ () {}
<__main__.C object at 0x6fc10>
=====================
one
A.__new__ () {}
<__main__.B object at 0x6fc10>
=====================
three
<class '__main__.B'>
<class '__main__.B'>
B.__new__ () {}
four
B.__init__ () {}
<__main__.B object at 0x6fc10>
40:~/ndfi grahamellis$
In class C, there's only an __init__ so that's run. Class A has both, and so the __new__ take precedence. In class B, the __new__ takes precendence but it makes an apparent recursive call that's been diverted to __init__ as something of a safeguard -
for illustrative purposes, this one!
When would you use __new__?
1. When you want you constructor to return an object of a different type to the class in which it is defined. For example, you have a class "animal" with subclasses "farmanimal" and "pet" and you want the animal cosntructor to be able to examine the data passed in to it and return an animal ... OR a farmanimal OR a pet depending on that data.
2. It has been suggested that experienced base class programmers override __new__ to discourage programmers who subclass them from overwriting their constructors. Personally, I would suggest that a good training course is better than this form of security through obscurity.
(written 2007-04-14 07:20:47)
Associated topics are indexed under
Y112 - Python - Objects - Intermediate [2485] How do I set up a constant in Python? - (2009-10-31)
[2409] TypeError: super() argument 1 must be type, not classobj (Python) - (2009-09-18)
[2368] Python - fresh examples of all the fundamentals - (2009-08-20)
[1819] Calling base class constructors - (2008-10-03)
[1661] Equality, sameness and identity - Python - (2008-05-31)
[1644] Using a utility method to construct objects of different types - Python - (2008-05-17)
[1517] Python - formatting objects - (2008-01-24)
[1217] What are factory and singleton classes? - (2007-06-04)
[964] Practical polymorphism in action - (2006-12-04)
[903] Pieces of Python - (2006-10-23)
[831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
[656] Think about your design even if you don't use full UML - (2006-03-24)
[477] Class, static and unbound variables - (2005-10-25)
[383] Overloading of operators on standard objects in Python - (2005-07-19)
[296] Using a Python dictionary as a holder of object attributes - (2005-04-30)
Y212 - Further advanced features of Python [2616] Defining a static method - Java, Python and Ruby - (2010-02-01)
[2123] Using Python with OpenOffice - (2009-04-09)
[1555] Advanced Python, Perl, PHP and Tcl training courses / classes - (2008-02-25)
[1148] Python decorators - wrapping a method call in extra code - (2007-04-15)
[1140] Python GTK - Widget, Packing, Event and Feedback example - (2007-04-09)
[235] Preparation for a day's work - (2005-03-04)
Some other Articles
Helsinki - what comes naturallyTurning objects into something you can store - Pickling (Python)A picture (mostly in words) of Helsinki__new__ v __init__ - python constructor alternatives?Using a list of keys and a list of values to make a dictionary in Python - zipPython dictionary for quick look upsA course in HelsinkiPlanters in the SpringA strong team broadens the professional coverage