title: Is __all__ in __init__.py, needed when accessing class or method?
body: <p>Googling around, I read many answers explaining that <code>__all__</code> is for 'from some.package.name <code>import *</code>' , restricting importable modules to only ones inside it.</p>
  
  <p>I'm absolutely sure it's true, if I want to import all the modules using wildcard from packages. But my question is about when I want to import some lower level objects like class, functions than modules, from package directly, the <code>__all__</code> seems useless because to directly access the class from packages, it's the only way to import class from modules under the package into the <code>__init__</code> file.   </p>
  
  <p>Here's example
  While doing some Django jobs, I recognized that Django-contributors really enjoy using <code>__all__</code>in the <code>__init__.py</code> files.</p>
  
  <p>For example, in the basic Django package, models, <code>__init__</code> files go like this.</p>
  
  <p><strong><code>django.db.model.__init__.py</code></strong></p>
  
  <pre><code>---skipped---
  
  from django.db.models.base import DEFERRED, Model  #
  
  ---skipped---
  
  __all__ = aggregates_all + constraints_all + fields_all + indexes_all
  __all__ += [
      '---skipped---'
      'Prefetch', 'Q', 'QuerySet', 'prefetch_related_objects', 'DEFERRED', 'Model',
  ]
  </code></pre>
  
  <p>You can see that here, 'Model' is definitely included <code>__all__</code> ,but problem here is it's already imported upper lines, so if you don't include 'Model' in <code>__all__</code>, you can import it with from statement <code>from django.db.models import *</code>.</p>
  
  <p>So I concluded that, in this case <code>__all__</code> is redundant or needless, and that the purpose of writing 'Model' despite its redundancy is that for readability. </p>
  
  <p>Do you think it's the right conclusion? </p>