First of all, as mentioned above, class names should be CapWords, e.g.:
class SampleClass:
...
BEWARE: Having the same name for file (module) and class creates confusions.
Example 1: Say you have the following module structure:
src/
__init__.py
SampleClass.py
main.py
Your SampleClass.py
is:
class SampleClass:
...
Your main.py
is:
from src import SampleClass
instance = SampleClass()
Will this code work? NO, cause you should've done either from src.SampleClass import SampleClass
or instance = SampleClass.SampleClass()
. Awkward code, isn't it?
You can also fix it by adding the following content to __init__.py
:
from .SampleClass import SampleClass
Which leads to the Example 2.
Example 2: Say you develop a module:
src/
__init__.py
BaseClass.py
ConcreteClass.py
main.py
BaseClass.py
content:
class BaseClass:
...
ConcreteClass.py
content:
from src import BaseClass
class ConcreteClass(BaseClass):
...
And your __init__.py
content:
from .ConcreteClass import ConcreteClass
from .BaseClass import BaseClass
And main.py
content is:
from src import ConcreteClass
instance = ConcreteClass()
The code fails with an error:
class ConcreteClass(BaseClass):
TypeError: module() takes at most 2 arguments (3 given)
It took me a while to understand the error and why I cannot inherit from the class, cause in previous example when I added exports to __init__.py
file everything worked. If you use snake case file names it does not fix the problem but the error is a bit easier to understand:
ImportError: cannot import name 'BaseClass' from partially initialized module 'src'
To fix the code you need to fix the import in ConcreteClass.py
to be: from .BaseClass import BaseClass
.
Last caveat, if in original code you would switch places imports in __init__.py
so it looks like:
from .BaseClass import BaseClass
from .ConcreteClass import ConcreteClass
Initial code works, but you really don't want anyone to write a code that will depend on the order of imports. If someone changes the order or applies isort
tool to organize imports, good luck fixing those bugs.