When you pass a python object to an API method which expects an MString, the internal conversion to MString behaves the same as the python call unicode(param). This means if param is of type str, it will be decoded using the default codec. In general, if you use non-ascii characters, it is safer to pass unicode objects.
When creating a proxy class in a creator() function or any other function that returns the class to Maya, you must call OpenMayaMPx.asMPxPtr() on the new object. This call transfers ownership of the object to Maya. If this call is not made, then Python retains ownership and can dereference the object and destroy it even though Maya may have a pointer to it.
If a command tries to parse its flags directly from the MArgList passed to its doIt() method, those flags will not be available for use when the command is used from Python. This is true regardless of whether the command was written in Python or C++.
It is possible to mix Maya Python API calls along with Maya command calls in the same script. Undoing the operations of such a script will not be correct if the Maya Python API calls modify the model and do not properly support undo using the MPxCommand class.
When comparing these interfaces to the shared libraries we ship for the C++ Maya API, the only difference is a new OpenMayaMPx module. This module contains the bindings for any proxy or MPx class we provide.
The Maya API C++ include files are used to generate the bindings for the Maya Python API. These files are not required when programming with the Maya Python API but are useful to see what is included or excluded in the bindings, since not all items in the C++ API are scriptable.