I know there's no such thing as a "private" constructor in Python. But, considering the user might need the class name to test its type, what if at least I want to communicate this through existing conventions? I see two options: Name the class MyClass. The user can do if instance(xyz, mymod.MyClass). However it looks like instantiating mymod.MyClass with mymod.MyClass(...) is perfectly legit, but from the perspective of the API it's not. Name the class _MyClass. "Calling" the class to instantiate it with mymod._MyClass(...) now doesn't feel super legit, which is good. However, type testing becomes if instance(xyz, mymod._MyClass) which is a bit ugly. Plus I'm not sure it's Pythonic to export a name starting with _. Option #1 is what I encounter the most, but it's not perfect: documentation will need to indicate that you can't instantiate mymod.MyClass. There's actually a third option which is to do this basically. But I don't see this often either. For reference, I'm looking for the most common convention to implement this C++ idiom in Python: class MyClass { private: MyClass() { // ... } public: static MyClass create(...) { return MyClass {...}; } }; Continue reading...