Why is it that in the following code, using a class variable as a method pointer results in unbound method error, while using an ordinary variable works fine:
You're running into the behavior of "unbound methods" in Python 2.x. Basically, in Python 2.x, when you get an attribute of a class (e.g. in this case Cmd.cmd), and the value is a function, then the class "wraps" the function into a special "unbound method" object, because they assume that attributes of classes that are functions and are not decorated with staticmethod or classmethod are meant to be instance methods (an incorrect assumption in this case). This unbound method expects an argument when called, even though in this case the underlying function does not expect an argument.
This behavior is explained in the language reference:
(in the "Classes" section)
When a class attribute reference (for class C, say) would yield a user-defined function object or [...], it is transformed into an unbound user-defined method object whose im_class attribute is C.
(in the "User-defined methods" section)
When a user-defined method object is created by retrieving a user-defined function object from a class, its im_self attribute is None and the method object is said to be unbound.
[...]
When an unbound user-defined method object is called, the underlying function (im_func) is called, with the restriction that the first argument must be an instance of the proper class (im_class) or of a derived class thereof.
That is what is causing the error you're seeing.
You could explicitly retrieve the underlying function out of the method object and call that (but it's obviously not ideal to need to do this):
Cmd.cmd.im_func()
Note that Python 3.x got rid of unbound methods and your code would run fine on Python 3.x