Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
 
Python and Tcl - public course schedule [here]
Private courses on your site - see [here]
Please ask about maintenance training for Perl, PHP, Lua, etc
 
Changing what operators do on objects - a comparison across different programming languages

In Object Oriented languages, you used named pieces of code known as methods to perform an operation on a variable - for example you might write
  weeklist.extend(weekend)
to take a list of (something) for a week and add a list relating to weekend onto the end of it.

Sometimes, the method you use might be considered to be an "addition" and in some languages you can actually (re)define operators such as "+" so that you can write things like
  week = weeklist + weekend
if you want to.

This facility is know as "operator overloading" and, given the right circumstances and a language that supports it, it can be very useful indeed. I'm going to take a look at each of the languages I teach, and where operator overloading is available I'll show you how to call it. I have also overloaded the conversion of objects into strings where I can, so that you can simple write something like
  print (object_var_name)
and you'll get a good representation of the object, not just a type / memory addrss / error message.

C and C++

In C++, you can overload the "+" operator by defining a function called opertor+ in you class. It doesn't work too well with pointers, because the C++ compile needs to be able to use + to do address (pointer) arithmetic.

Here's an example of how our test program ran:

  WomanWithCat:ruby grahamellis$ ./overload_add
  Service every 10 uses for Beans
  Service every 7 uses for Water
  Service every 4.11765 uses for Beans; Water
  WomanWithCat:ruby grahamellis$


And here's the calling code:

  int main () {
    Mtbs *beans = new Mtbs(10.0,"Beans");
    Mtbs *water = new Mtbs(7.0,"Water");
    Mtbs fill = *beans + *water;
    cout << *beans << endl;
    cout << *water << endl;
    cout << fill << endl;
  }


The complete example, including the definition of the class and the add method within it, may be found [here].

Perl

In Perl, the use overload pragma lets you reassign an operator (and indeed " to " is an operator) to a named function. Once you've done that you can write things like

  $beans = new mtbs(10,"Beans");
  $water = new mtbs(7,"Water");
  $fill = $beans + $water;
  print $beans;
  print $water;
  print $fill;


and get results like

  WomanWithCat:ruby grahamellis$ perl overload_add.pl
  Service Beans every 10.00 cups
  Service Water every 7.00 cups
  Service Beans and Water every 4.12 cups
  WomanWithCat:ruby grahamellis$


The complete example, together with the add and "tostring" methods used to redefine addition, may be found [here].

Python

In Python, everything's an object and so it's perhaps the most natural language in which to override operators - in fact operators are no more than "syntactic icing" around the language's object syntax in the first place!

Source code calling up the methods will look like:

  if __name__ == "__main__":
    beans = mtbs(10,"Beans")
    water = mtbs(7,"Water")
    fill = beans + water
    print beans
    print water
    print fill


Which runs as follows:

  WomanWithCat:ruby grahamellis$ python overload_add.py
  Beans every 10.00
  Water every 7.00
  Beans and Water every 4.12
  WomanWithCat:ruby grahamellis$


Full source code for the complete example, including definition of the __add__ method, may be found [here].

With Python, note that as well as the __add__ method to overload addition based on the obejct to the left of the + sign, you can also provide a __radd__ method to overload the object to the right, and an __iadd__ method to overload the += operator.

Ruby

You define addition on your own objects in Ruby by defining a method called "+" in the class you want to be able to add - beautifuly simple. Here's the calling code:

  if __FILE__ == $0
    beans = Mtbs.new(10,"Beans")
    water = Mtbs.new(7,"Water")
    fill = beans + water
    print beans
    print water
    print fill
  end


And the result from running that code:

  WomanWithCat:ruby grahamellis$ ruby overload_add.rb
  Every 10.00 service Beans
  Every 7.00 service Water
  Every 4.12 service Beans or Water
  You have new mail in /var/mail/grahamellis
  WomanWithCat:ruby grahamellis$


The complete code, including the definition of the class, may be found [here].

PHP and Java

PHP and Java do not support operator overloading, partly on a matter of principle and partly because the folks who look after the languages don't see a need for it. They're probably correct in that assessment, as languages do differ from one another and the very obvious gains that operator overriding has in language such as Python and Ruby are by no means obviously advantages in either Java or PHP.

Lua

In lua, you can define the __add method in a metatable, and associate that metatable with any other table you wish, which will result in you changing the character of what the + operator does when applied to that table. So you can write code like

  if __FILE__ == $0
    beans = Mtbs.new(10,"Beans")
    water = Mtbs.new(7,"Water")
    fill = beans + water
    print beans
    print water
    print fill
end


which produced results like

  WomanWithCat:ruby grahamellis$ lua overload_add.lua
  Attention needed for Beans every 10.00 cups
  Attention needed for Water every 7.00 cups
  Attention needed for Beans plus Water every 4.12 cups
  WomanWithCat:ruby grahamellis$


The complete example, including setting up the tables with Mtbs characeristics, may be found [here].

Tcl

Alone amongst the languages that we teach, Tcl does not have natural objects nor method overrides, although there is an object capability within IncrTcl.




Operator overload is a bit specialist on many of our courses - we'll cover it on an as-requeired basis, but these examples are always available to get your started. Our course descriptions / public schedule is [here] .. please ask if you want private training on site, or coverage of specific intermediate or advanced topics - we can often help!
WomanWithCat:ruby grahamellis$

(written 2014-12-26, updated 2014-12-30)

 
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
R108 - Ruby - More Classes and Objects
  [4551] Testing your new class - first steps with cucumber - (2015-10-23)
  [4550] Build up classes into applications sharing data types in Ruby - (2015-10-23)
  [4504] Where does Ruby load modules from, and how to load from current directory - (2015-06-03)
  [3782] Standard methods available on all objects in Ruby - (2012-06-23)
  [3781] Private, Protected, Public in Ruby. What about interfaces and abstract classes in Ruby? - (2012-06-23)
  [3760] Why you should use objects even for short data manipulation programs in Ruby - (2012-06-10)
  [3260] Ruby - a training example that puts many language elements together to demonstrate the whole - (2011-04-23)
  [3158] Ruby training - some fresh examples for string handling applications - (2011-02-05)
  [3154] Changing a class later on - Ruby - (2011-02-02)
  [3142] Private and Public - and things between - (2011-01-22)
  [2980] Ruby - examples of regular expressions, inheritance and polymorphism - (2010-10-02)
  [2977] What is a factory method and why use one? - Example in Ruby - (2010-09-30)
  [2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
  [2623] Object Oriented Ruby - new examples - (2010-02-03)
  [2620] Direct access to object variable (attributes) in Ruby - (2010-02-02)
  [2616] Defining a static method - Java, Python and Ruby - (2010-02-01)
  [2604] Tips for writing a test program (Ruby / Python / Java) - (2010-01-29)
  [2603] Ruby objects - a primer - (2010-01-29)
  [2601] Ruby - is_a? v instance_of? - what is the difference? - (2010-01-27)
  [2292] Object Orientation in Ruby - intermediate examples - (2009-07-16)
  [1587] Some Ruby programming examples from our course - (2008-03-21)
  [1217] What are factory and singleton classes? - (2007-06-04)
  [656] Think about your design even if you don't use full UML - (2006-03-24)
  [184] MTBF of coffee machines - (2005-01-20)

C234 - C and C based languages - Further C++ Object Oriented features
  [4559] When do I use the this keyword in C++? - (2015-10-29)
  [4377] Designing a base class and subclasses, and their extension, in C++ - (2015-01-01)
  [3982] Using a vector within an object - C++ - (2013-01-19)
  [3509] Operator Overloading, Exceptions, Pointers, References and Templates in C++ - new examples from our courses - (2011-11-06)
  [3430] Sigils - the characters on the start of variable names in Perl, Ruby and Fortran - (2011-09-10)
  [3238] Bradshaw, Ben and Bill. And some C and C++ pointers and references too. - (2011-04-09)
  [3124] C++ - putting the language elements together into a program - (2011-01-08)
  [3069] Strings, Garbage Collection and Variable Scope in C++ - (2010-11-25)
  [3057] Lots of things to do with and within a C++ class - (2010-11-16)
  [2849] What are C++ references? Why use them? - (2010-07-02)
  [2673] Multiple Inheritance in C++ - a complete example - (2010-03-12)
  [2576] What does const mean? C and C++ - (2010-01-15)
  [2005] Variables and pointers and references - C and C++ - (2009-01-23)
  [2004] Variable Scope in C++ - (2009-01-22)
  [1819] Calling base class constructors - (2008-10-03)
  [1159] It can take more that one plus one to get two. - (2007-04-22)
  [831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
  [802] undefined reference to typeinfo - C++ error message - (2006-07-15)
  [801] Simple polymorphism example - C++ - (2006-07-14)

P218 - Perl - More Objects
  [4356] Object factories in C++, Python, PHP and Perl - (2014-12-19)
  [4098] Using object orientation for non-physical objects - (2013-05-22)
  [4096] Perl design patterns example - (2013-05-20)
  [3941] Building an object based on another object in Perl - (2012-12-03)
  [3581] Perl - calls to methods that use => - what do they mean? - (2012-01-16)
  [3377] What do I mean when I add things in Perl? - (2011-08-02)
  [3098] Learning Object Orientation in Perl through bananas and perhaps Moose - (2010-12-21)
  [3097] Making Perl class definitions more conventional and shorter - (2010-12-20)
  [2972] Some more advanced Perl examples from a recent course - (2010-09-27)
  [2876] Different perl examples - some corners I rarely explore - (2010-07-18)
  [2811] Igloos melt in the summer, but houses do not - (2010-06-15)
  [2651] Calculation within objects - early, last minute, or cached? - (2010-02-26)
  [2427] Operator overloading - redefining addition and other Perl tricks - (2009-09-27)
  [1949] Nuclear Physics comes to our web site - (2008-12-17)
  [1665] Factory method example - Perl - (2008-06-04)
  [1664] Example of OO in Perl - (2008-06-03)
  [1435] Object Oriented Programming in Perl - Course - (2007-11-18)
  [1320] Perl for Larger Projects - Object Oriented Perl - (2007-08-25)
  [930] -> , >= and => in Perl - (2006-11-18)
  [592] NOT Gone phishing - (2006-02-05)
  [588] Changing @INC - where Perl loads its modules - (2006-02-02)
  [531] Packages in packages in Perl - (2005-12-16)
  [246] When to bless a Perl variable - (2005-03-15)
  [227] Bellringing and Programming and Objects and Perl - (2005-02-25)

Y112 - Python - Objects - Intermediate
  [4719] Nesting decorators - (2016-11-02)
  [4718] Defining an object that is a modified standard type in Python - (2016-11-02)
  [4717] with in Python - examples of use, and of defining your own context - (2016-11-02)
  [4649] Object and Static methods - what is the difference; example in Python 3 - (2016-02-17)
  [4541] Setting up and tearing down with the Python with keyword - (2015-10-16)
  [4450] Deciding whether to use parameters, conditional statements or subclasses - (2015-03-05)
  [4449] Spike solution, refactoring into encapsulated object methods - good design practise - (2015-03-05)
  [4410] A good example of recursion - a real use in Python - (2015-02-01)
  [4344] Python base and inherited classes, test harness and unit testing - new examples - (2014-12-07)
  [4094] Python Properties - how and why - (2013-05-18)
  [4028] Really Simple Class and Inheritance example in Python - (2013-03-04)
  [3887] Inheritance, Composition and Associated objects - when to use which - Python example - (2012-10-10)
  [3796] Backquote, backtic, str and repr in Python - conversion object to string - (2012-07-05)
  [3524] Metaclasses (Python) and Metatables (Lua) - (2011-11-17)
  [3472] Static variables in functions - and better ways using objects - (2011-10-10)
  [3442] A demonstration of how many Python facilities work together - (2011-09-16)
  [3002] A list of special method and attribute names in Python - (2010-10-17)
  [2994] Python - some common questions answered in code examples - (2010-10-10)
  [2905] Defining static methods in Python - (2010-08-05)
  [2889] Should Python classes each be in their own file? - (2010-07-27)
  [2785] The Light bulb moment when people see how Object Orientation works in real use - (2010-05-28)
  [2764] Python decorators - your own, staticmethod and classmethod - (2010-05-14)
  [2722] Mixins example in Python - (2010-04-14)
  [2720] Multiple inheritance in Python - complete working example - (2010-04-14)
  [2693] Methods that run on classes (static methods) in Python - (2010-03-25)
  [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)
  [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)
  [1146] __new__ v __init__ - python constructor alternatives? - (2007-04-14)
  [964] Practical polymorphism in action - (2006-12-04)
  [903] Pieces of Python - (2006-10-23)
  [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)

U108 - Lua - Pattern matching
  [3687] Binary / bitwise operations in Lua with the standard bit32 library - (2012-04-06)
  [2727] Making a Lua program run more than 10 times faster - (2010-04-16)
  [2702] First and last match with Regular Expressions - (2010-04-02)
  [2383] Lua Regular Expressions - (2009-08-28)
  [1847] Lua - IAQ (Infrequently Answered Questions) - (2008-10-18)
  [1744] Lua examples, Lua Courses - (2008-08-08)

J710 - Java - Extending Classes and More
  [4422] Objects - from physical to virtual or abstract - Java - (2015-02-10)
  [4419] Java Inheritance example - group of classes - step by step - (2015-02-08)
  [4394] Philosophy behind object design - and how I applied in to a Java example - (2015-01-14)
  [4334] Splitting out code into name blocks for clarity and reusability - (2014-11-30)
  [3047] What is a universal superclass? Java / Perl / Python / Other OO languages - (2010-11-13)
  [2860] What methods are available on this Java object? - (2010-07-08)
  [2434] Abstract classes, Interfaces, PHP and Java - (2009-10-03)
  [2185] Abstract Classes - Java - (2009-05-16)
  [1556] Java - a demonstration of inheritance on just one page - (2008-02-26)
  [1538] Teaching Object Oriented Java with Students and Ice Cream - (2008-02-12)
  [1501] Java - using super to call a method in the parent class - (2008-01-10)
  [1294] An example of Java Inheritance from scratch - (2007-08-00)
  [1066] Final, Finally and Finalize - three special words in Java - (2007-02-05)

H108 - Objects in PHP
  [4628] Associative objects - one object within another. - (2016-01-20)
  [4627] Caching results in an object for efficiency - avoiding re-calculation - (2016-01-20)
  [4626] Singleton design pattern - examples and uses - (2016-01-20)
  [4073] Learning about Object Orientation in PHP - a new set of examples - (2013-04-28)
  [4057] stdClass in PHP - using an object rather than an associative array - (2013-04-02)
  [3953] Objects in PHP - Revision - (2012-12-16)
  [3843] Caching Design Patterns - (2012-08-20)
  [3841] Copying, duplicating, cloning an object in PHP - (2012-08-18)
  [3840] Autoload in PHP - (2012-08-17)
  [3609] How do classes relate to each other? Associated Classes - (2012-02-12)
  [3608] Design Patterns - what are they? Why use them? - (2012-02-12)
  [3607] Designing your application - using UML techniques - (2012-02-11)
  [3211] Computer Graphics in PHP - World (incoming data) to Pixel (screen) conversion - (2011-03-24)
  [3210] Catchable fatal error in PHP ... How to catch, and alternative solutions such as JSON - (2011-03-22)
  [2922] Getting the OO design write - with PHP a example - (2010-08-14)
  [2921] Does copying a variable duplicate the contents? - (2010-08-14)
  [2774] PHP - Object Oriented Design in use - (2010-05-21)
  [2741] What is a factory? - (2010-04-26)
  [2680] Static class members in PHP - a documented example - (2010-03-16)
  [2641] Object Oriented Programming in PHP - (2010-02-19)
  [2632] Shipping a test harness with your class in PHP - (2010-02-12)
  [2435] Serialization - storing and reloading objects - (2009-10-04)
  [2380] Object Oriented programming - a practical design example - (2009-08-27)
  [2172] PHP4 v PHP5 - Object Model Difference - (2009-05-11)
  [2171] Cleaning up redundant objects - (2009-05-11)
  [2169] When should I use OO techniques? - (2009-05-11)
  [2160] PHP - getclass v instanceof - (2009-05-07)
  [1925] Introduction to Object Oriented Programming - (2008-12-06)
  [1820] Sorting objects in PHP - (2008-10-04)
  [1682] Accounts in PHP - an OO demo - (2008-06-19)
  [1535] OO PHP demonstration - comparing objects and more - (2008-02-08)
  [1153] Object Oriented Model - a summary of changes from PHP4 to PHP5 - (2007-04-18)
  [1027] Cue the music, I'm happy. - (2007-01-09)
  [836] Build on what you already have with OO - (2006-08-17)
  [720] Planning a hotel refurb - an example of a Gant chart in PHP - (2006-05-14)
  [485] North, Norther and Northest - PHP 5 Objects - (2005-11-04)
  [421] Don't repeat code - use loops or functions - (2005-08-21)
  [343] Should I use structured or object oriented? - (2005-06-10)
  [205] PHP5 lets you say no - (2005-02-07)
  [124] PHP v Java - (2004-11-20)
  [67] Object Oriented Programming in PHP - (2004-09-29)


Back to
The changing face of Christmas
Previous and next
or
Horse's mouth home
Forward to
A year of rail memories!
Some other Articles
Conditionals, loops and methods in Ruby - a primer with simple examples
Ruby - the second rung of learning the language
Shuffling a list - Ruby and Python
A year of rail memories!
Changing what operators do on objects - a comparison across different programming languages
The changing face of Christmas
Christmas day in Melksham
A quiet evening in Melksham - awaiting Santa
What a difference a year makes
Multiple yields and no loops in a Python generator?
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).

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2019: 404 The Spa • Melksham, Wiltshire • United Kingdom • SN12 6QL
PH: 01225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/4366_Cha ... uages.html • PAGE BUILT: Sat May 27 16:49:10 2017 • BUILD SYSTEM: WomanWithCat