what is the difference between @classmethod and @cm from the code below?
decorator is calling during class creation time before an instance is  created.
In your case, since @cm returns func(self.__class__, *args, **kwargs), which is relied on self, it should be used as a instance method.
On the other hand, @classmethod is able to use before an instance is created.
def cm(func):
    def decorated(self, *args, **kwargs):
        return func(self.__class__, *args, **kwargs)
    return decorated
class C:
    @classmethod
    def inc1(cls):
        (blablabla)
    @cm 
    def inc3(cls):
        (blablabla)
C().inc1() # works as a instance method
C.inc1()   # works as a classmethod
C().inc3() # works as a instance method
C.inc3()   # TypeError: unbound method decorated() must be called with C instance as first argument (got nothing instead)
For a combination of classmethod and property, it could be done by return an customized object. Reference
class ClassPropertyDescriptor(object):   
    def __init__(self, f):
        self.f = f
    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        return self.f.__get__(obj, klass)()
def classproperty(func):
    if not isinstance(func, (classmethod, staticmethod)):
        func = classmethod(func)    
    return ClassPropertyDescriptor(func)
class C:
    @classproperty
    def inc1(cls):
        (blablabla)
C.inc1   # works as a classmethod property
[Edit]
Q. What does the classmethod() call do with the method it decorates to achieve that? 
The implementation can be done by using descriptor
class ClassMethodDescriptor(object):    
    def __init__(self, f):
        self.f = f
    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        def newfunc(*args):
            return self.f(klass, *args)
        return newfunc
def myclassmethod(func):
    return ClassMethodDescriptor(func)  
class C:
    @myclassmethod
    def inc1(cls):
        (blablabla)
C.inc1()   # works as a classmethod
Q. Why is the result not callable?
Because the implementation of ClassMethodDescriptor does not define __call__ function. Once using @property, it will return ClassMethodDescriptor which is not callable.