The biggest reason for using a @classmethod is in an alternate constructor that is intended to be inherited.  This can be very useful in polymorphism. An example:
class Shape(object):
    # this is an abstract class that is primarily used for inheritance defaults
    # here is where you would define classmethods that can be overridden by inherited classes
    @classmethod
    def from_square(cls, square):
        # return a default instance of cls
        return cls()
Notice that Shape is an abstract class that defines a classmethod from_square, since Shape is not really defined, it does not really know how to derive itself from a Square so it simply returns a default instance of the class.
Inherited classes are then allowed to define their own versions of this method:
class Square(Shape):
    def __init__(self, side=10):
        self.side = side
    @classmethod
    def from_square(cls, square):
        return cls(side=square.side)
class Rectangle(Shape):
    def __init__(self, length=10, width=10):
        self.length = length
        self.width = width
    @classmethod
    def from_square(cls, square):
        return cls(length=square.side, width=square.side)
class RightTriangle(Shape):
    def __init__(self, a=10, b=10):
        self.a = a
        self.b = b
        self.c = ((a*a) + (b*b))**(.5)
    @classmethod
    def from_square(cls, square):
        return cls(a=square.length, b=square.width)
class Circle(Shape):
    def __init__(self, radius=10):
        self.radius = radius
    @classmethod
    def from_square(cls, square):
        return cls(radius=square.length/2)
The usage allows you to treat all of these uninstantiated classes polymorphically
square = Square(3)
for polymorphic_class in (Square, Rectangle, RightTriangle, Circle):
    this_shape = polymorphic_class.from_square(square)
This is all fine and dandy you might say, but why couldn't I just use as @staticmethod to accomplish this same polymorphic behavior:
class Circle(Shape):
    def __init__(self, radius=10):
        self.radius = radius
    @staticmethod
    def from_square(square):
        return Circle(radius=square.length/2)
The answer is that you could, but you do not get the benefits of inheritance because Circle has to be called out explicitly in the method.  Meaning if I call it from an inherited class without overriding, I would still get Circle every time.
Notice what is gained when I define another shape class that does not really have any custom from_square logic:
class Hexagon(Shape):
    def __init__(self, side=10):
        self.side = side
    # note the absence of classmethod here, this will use from_square it inherits from shape
Here you can leave the @classmethod undefined and it will use the logic from Shape.from_square while retaining who cls is and return the appropriate shape.
square = Square(3)
for polymorphic_class in (Square, Rectangle, RightTriangle, Circle, Hexagon):
    this_shape = polymorphic_class.from_square(square)