Counter object in Python with public and private methods
The private objects and attributes are easily accessed using inspect.getclosurevars:

&gt;&gt;&gt; c = CounterController()
&gt;&gt;&gt; import inspect
&gt;&gt;&gt; inspect.getclosurevars(c.add_one_endpoint)
ClosureVars(nonlocals={'counter_controller': &lt;__main__.CounterController.&lt;locals&gt;.CounterControllerPrivate object at 0x10a047cf8&gt;}, globals={}, builtins={}, unbound={'add_one'})
&gt;&gt;&gt; _.nonlocals['counter_controller']
&lt;__main__.CounterController.&lt;locals&gt;.CounterControllerPrivate object at 0x10a047cf8&gt;
&gt;&gt;&gt; _.counter
0


So you might consider whether it's worth spending a lot of effort on this approach. Personally I would spend the effort on API documentation instead.