Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
 
For 2021 - online Python 3 training - see ((here)).

Our plans were to retire in summer 2020 and see the world, but Coronavirus has lead us into a lot of lockdown programming in Python 3 and PHP 7.
We can now offer tailored online training - small groups, real tutors - works really well for groups of 4 to 14 delegates. Anywhere in the world; course language English.

Please ask about private 'maintenance' training for Python 2, Tcl, Perl, PHP, Lua, etc.
__new__ v __init__ - python constructor alternatives?

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, updated 2007-04-18)

 
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Y212 - Python - Code testing, patterns, profiles and optimisation.
  [235] Preparation for a day's work - (2005-03-04)
  [1140] Python GTK - Widget, Packing, Event and Feedback example - (2007-04-09)
  [1148] Python decorators - wrapping a method call in extra code - (2007-04-15)
  [1555] Advanced Python, Perl, PHP and Tcl training courses / classes - (2008-02-25)
  [2123] Using Python with OpenOffice - (2009-04-09)
  [2616] Defining a static method - Java, Python and Ruby - (2010-02-01)
  [3441] Pressing ^C in a Python program. Also Progress Bar. - (2011-09-15)
  [3442] A demonstration of how many Python facilities work together - (2011-09-16)
  [3464] Passing optional and named parameters to python methods - (2011-10-04)
  [3478] Testing your Python classes with the unittest package - how to - (2011-10-14)
  [3658] Using Make for a distribution - (2012-03-17)
  [4090] Test Driven Development in Python - Customer Comes First - (2013-05-16)
  [4326] Learning to program - comments, documentation and test code - (2014-11-22)
  [4344] Python base and inherited classes, test harness and unit testing - new examples - (2014-12-07)
  [4446] Combining tests into suites, and suites into bigger suites - Python and unittest - (2015-03-01)
  [4470] Testing in Python 3 - unittest, doctest and __name__ == __main__ too. - (2015-04-21)
  [4538] Flask and unittest - hello web app test world - (2015-10-15)
  [4540] Unittest of a Flask application including forms - (2015-10-15)
  [4542] The principle of mocking - and the Python Mock package - (2015-10-17)
  [4617] Pytest - starting example - (2016-01-07)
  [4618] Pytest - second example beyond hello world - (2016-01-08)
  [4716] Profiling your Python program - (2016-11-01)

Y112 - Python - Objects - Intermediate
  [296] Using a Python dictionary as a holder of object attributes - (2005-04-30)
  [383] Overloading of operators on standard objects in Python - (2005-07-19)
  [477] Class, static and unbound variables - (2005-10-25)
  [656] Think about your design even if you don't use full UML - (2006-03-24)
  [831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
  [903] Pieces of Python - (2006-10-23)
  [964] Practical polymorphism in action - (2006-12-04)
  [1217] What are factory and singleton classes? - (2007-06-04)
  [1517] Python - formatting objects - (2008-01-24)
  [1644] Using a utility method to construct objects of different types - Python - (2008-05-17)
  [1661] Equality, sameness and identity - Python - (2008-05-31)
  [1819] Calling base class constructors - (2008-10-03)
  [2368] Python - fresh examples of all the fundamentals - (2009-08-20)
  [2409] TypeError: super() argument 1 must be type, not classobj (Python) - (2009-09-18)
  [2485] How do I set up a constant in Python? - (2009-10-31)
  [2693] Methods that run on classes (static methods) in Python - (2010-03-25)
  [2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
  [2720] Multiple inheritance in Python - complete working example - (2010-04-14)
  [2722] Mixins example in Python - (2010-04-14)
  [2764] Python decorators - your own, staticmethod and classmethod - (2010-05-14)
  [2785] The Light bulb moment when people see how Object Orientation works in real use - (2010-05-28)
  [2889] Should Python classes each be in their own file? - (2010-07-27)
  [2905] Defining static methods in Python - (2010-08-05)
  [2994] Python - some common questions answered in code examples - (2010-10-10)
  [3002] A list of special method and attribute names in Python - (2010-10-17)
  [3472] Static variables in functions - and better ways using objects - (2011-10-10)
  [3524] Metaclasses (Python) and Metatables (Lua) - (2011-11-17)
  [3796] Backquote, backtic, str and repr in Python - conversion object to string - (2012-07-05)
  [3887] Inheritance, Composition and Associated objects - when to use which - Python example - (2012-10-10)
  [4028] Really Simple Class and Inheritance example in Python - (2013-03-04)
  [4094] Python Properties - how and why - (2013-05-18)
  [4356] Object factories in C++, Python, PHP and Perl - (2014-12-19)
  [4366] Changing what operators do on objects - a comparison across different programming languages - (2014-12-26)
  [4410] A good example of recursion - a real use in Python - (2015-02-01)
  [4449] Spike solution, refactoring into encapsulated object methods - good design practise - (2015-03-05)
  [4450] Deciding whether to use parameters, conditional statements or subclasses - (2015-03-05)
  [4541] Setting up and tearing down with the Python with keyword - (2015-10-16)
  [4649] Object and Static methods - what is the difference; example in Python 3 - (2016-02-17)
  [4717] with in Python - examples of use, and of defining your own context - (2016-11-02)
  [4718] Defining an object that is a modified standard type in Python - (2016-11-02)
  [4719] Nesting decorators - (2016-11-02)


Back to
Using a list of keys and a list of values to make a dictionary in Python - zip
Previous and next
or
Horse's mouth home
Forward to
A picture (mostly in words) of Helsinki
Some other Articles
Helsinki - what comes naturally
Turning 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 - zip
Python dictionary for quick look ups
A course in Helsinki
Planters in the Spring
A strong team broadens the professional coverage
4759 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 at 50 posts per page


This is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price.

Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).

1 unpublished comment pending on this page

edit your own (not yet published) comments

© WELL HOUSE CONSULTANTS LTD., 2021: 48 Spa Road • Melksham, Wiltshire • United Kingdom • SN12 7NY
PH: 01144 1225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/1146_-ne ... ives-.html • PAGE BUILT: Sun Oct 11 16:07:41 2020 • BUILD SYSTEM: JelliaJamb