• If you want to write a class or static method in Python, you can write an object (or dynamic) method and then call the
classmethod function to make it into a method that can
additionally run on the the class as a whole:
def counter(cls):
# This is a 'dynamic' method
return thing.count
# Which we'll wrap to make (in effect) static too.
ctr = classmethod(counter)
Note that the method takes an object parameter (which we have chosen to label "cls" rather than "self") but it hasn't been used in the code block.
• In more recent versions of Python, you can also use a decorator to achieve the same thing - in fact, it's just a change of the syntax and does the same thing underneath - a decorator is a wrapper:
@classmethod
def counter2(self):
# "self" is the object or the class
return thing.count
• You can also use a
staticmethod decorator to define a static method - but in this case the static behavior
replaces the object or dynamic behavior rather than being additional, and so you don't pass in an object reference:
@staticmethod
def counter():
return thing.count
There are working examples of each of these in the source code which is
[here], written on yesterday's public python class where I was teaching
Python Programming.
(written 2010-03-25)
Associated topics are indexed under
Y112 - Python - Objects - Intermediate [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)
[2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
[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)
[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)
[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)
Some other Articles
Email metrics and filteringGarlic bread without garlicTCP v UDP / Client v Server - Python examplesMultiple processes (forking) in PythonMethods that run on classes (static methods) in PythonFlexible search and replace in PythonNew brochures for the Melksham areaThe World Company Register - is it another scam?Can my dog eat potatoes? Doggie Dietary Research, and political sleaze!Security considerations in programming - what do we teach?