Quello di cui parli si chiama dependency injection ed è considerato una buona pratica per rendere verificabile il codice. Non penso che ci sia qualcosa in Python che lo renderebbe unpitonico o una cattiva pratica.
Ci sono altri modi si potrebbe fare in Python, per esempio per l'importazione di moduli diversi a seconda una sorta di bandiera si passa:
class Foo(object):
def __init__(self, testing=False):
if testing:
import module_test as module
else:
import module
self.module = module
Ma passando un riferimento al modulo che si desidera utilizzare è più flessibile, separa meglio le preoccupazioni e non è meno Pythonic che passare un riferimento a una classe o istanza (o stringa o numero intero) che si desidera utilizzare.
Per l'ordinario caso d'uso (non-test), è possibile utilizzare un valore di argomento di default:
class Foo(object):
def __init__(self, module=None):
if not module:
import module
self.module = module
Sembra un'iniezione di dipendenza e in realtà è anche una buona idea. Tuttavia, quanto spesso hai bisogno di un intero modulo, piuttosto che di una o due funzioni/classi? – delnan