Ответ 1
То, о чем вы говорите, называется инъекцией зависимостей и считается хорошей практикой для проверки вашего кода. Я ничего не думаю о Python, который сделает его непитоновым или плохой практикой.
Есть другие способы сделать это в Python, например, импортируя разные модули в зависимости от какого-либо флага, в который вы проходите:
class Foo(object):
def __init__(self, testing=False):
if testing:
import module_test as module
else:
import module
self.module = module
Но передача ссылки на модуль, который вы хотите использовать, более гибкая, лучше отделяет проблемы и не менее Pythonic, чем передача ссылки на класс или экземпляр (или строку или целое число), которые вы хотите использовать.
Для обычного (не-тестового) варианта использования вы можете использовать значение аргумента по умолчанию:
class Foo(object):
def __init__(self, module=None):
if not module:
import module
self.module = module