Skip to content

Instantly share code, notes, and snippets.

@blaix
Last active October 20, 2015 21:16
Show Gist options
  • Save blaix/cf5b7daef08462ca1bea to your computer and use it in GitHub Desktop.
Save blaix/cf5b7daef08462ca1bea to your computer and use it in GitHub Desktop.
# dumb example object with no dependencies:
class Printer(object):
def println(self, message):
print message
# dumb example object with dependencies:
class Greeter(object):
# can't use it without deciding on a printer
# (forced dependency inversion)
def __init__(self, printer):
self.printer = printer
def say(self, msg):
self.printer.println(msg)
printer = Printer()
# explicitly resolve dependencies through the constructor:
greeter = Greeter(printer=printer)
test_greeter = Greeter(printer=Mock())
# If you are at the point that doing it by hand in production code is cumbersome
# or results in a duplicated knowledge - assuming a refactoring isn't the right solution
# to that problem - I like to use an explicit container that doesn't do any magic:
class Context(object):
objects = {}
@classmethod
def register(cls, name, object):
cls.objects[name] = object
@classmethod
def get(cls, name):
return cls.objects[name]
Context.register('printer', printer)
Context.register('greeter', greeter)
greeter_with_default_deps = Context.get('greeter')
class Context(object):
"""Factory for getting objects with default deps."""
@property
def printer(self):
return Printer()
@property
def greeter(self, **kwargs):
kwargs.setdefault('printer', self.printer)
return Greeter(**kwargs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment