Trying to come to grips with static methods

Robert Kern rkern at ucsd.edu
Tue Jul 12 05:17:34 EDT 2005


Cyril Bazin wrote:
> (sorry, my fingers send the mail by there own ;-)
> 
> Im my opinion, class method are used to store some functionalities 
> (function) related to a class in the scope of the class.
> 
> For example, I often use static methods like that:
> 
> class Point:
>     def __init__(self, x, y):
>         self.x, self.y = x, y
> 
>     def fromXML(xmlText):
>         x, y = functionToParseXMLUsingMinidomForExample(xmlText)
>         return Point(x, y)
>     fromXML = staticmethod(fromXML)
> 
> Here, it is used to define some kind of second constructor...
> 
> Note that class decorator can simplify the notation, but break the 
> compatility with older Python...

Huh? classmethod was introduced with staticmethod, and in fact, this use 
case is exactly what classmethods are for, not staticmethods.

In [2]: class Point(object):  # <-- note inheritance from object
    ...:     def __init__(self, x, y):
    ...:         self.x, self.y = x, y
    ...:     def fromXML(cls, xmlText):
    ...:         x, y = parseXML(xmlText)
    ...:         return cls(x, y)
    ...:     fromXML = classmethod(fromXML)
    ...:

In [3]: class NewPoint(Point):
    ...:     pass
    ...:

In [4]: def parseXML(xmlText):
    ...:     return 1, 4
    ...:

In [5]: p = NewPoint.fromXML('<point x="1" y="4"></point>')

In [6]: isinstance(p, NewPoint)
Out[6]: True

-- 
Robert Kern
rkern at ucsd.edu

"In the fields of hell where the grass grows high
  Are the graves of dreams allowed to die."
   -- Richard Harter




More information about the Python-list mailing list