classmethod
is a decorator, wrapping a function, and you can call the resulting object on a class or (equivalently) an instance thereof:
>>> class x(object):
... def c1(*args): print 'c1', args
... c1 = classmethod(c1)
... @classmethod
... def c2(*args): print 'c2', args
...
>>> inst = x()
>>> x.c1()
c1 (<class '__main__.x'>,)
>>> x.c2()
c2 (<class '__main__.x'>,)
>>> inst.c1()
c1 (<class '__main__.x'>,)
>>> inst.c2()
c2 (<class '__main__.x'>,)
As you see, whether you define it directly or with decorator syntax, and whether you call it on the class or the instance, the classmethod
always receives the class as its first argument.
One of the main uses of classmethod is to define alternative constructors:
>>> class y(object):
... def __init__(self, astring):
... self.s = astring
... @classmethod
... def fromlist(cls, alist):
... x = cls('')
... x.s = ','.join(str(s) for s in alist)
... return x
... def __repr__(self):
... return 'y(%r)' % self.s
...
>>> y1 = y('xx')
>>> y1
y('xx')
>>> y2 = y.fromlist(range(3))
>>> y2
y('0,1,2')
Now if you subclass y
, the classmethod keeps working, e.g.:
>>> class k(y):
... def __repr__(self):
... return 'k(%r)' % self.s.upper()
...
>>> k1 = k.fromlist(['za','bu'])
>>> k1
k('ZA,BU')
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…