It's not so much that you never have the headers... more that you don't always want to provide the headers to everyone (since they may contain things you don't want to share.)
I looked into it a bit further, and cppyy does have provisions for this: https://cppyy.readthedocs.io/en/latest/bindings_generation.h...
I may have misread that page, but it looks like you can create a .rootmap and .pcm file and distribute that instead of the C++ headers.