Skip to content

Instantly share code, notes, and snippets.

@majorz
Created April 9, 2013 01:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save majorz/5342257 to your computer and use it in GitHub Desktop.
Save majorz/5342257 to your computer and use it in GitHub Desktop.
Using composition
from abc import ABCMeta, abstractmethod
class Renderer(metaclass=ABCMeta):
def __init__(self, entity):
self._entity = entity
@abstractmethod
def __call__(self):
raise NotImplementedError
class IntRenderer(Renderer):
type_ = int
def __call__(self):
assert isinstance(self._entity, self.type_)
return 'INTEGER {}'.format(self._entity)
class FloatRenderer(Renderer):
type_ = float
def __call__(self):
assert isinstance(self._entity, self.type_)
return 'FLOAT {}'.format(self._entity)
class CompositeRenderer(Renderer):
_classes = [
IntRenderer,
FloatRenderer,
]
def __call__(self):
for render_class in self._classes:
if isinstance(self._entity, render_class.type_):
renderer = render_class(self._entity)
return renderer()
raise TypeError('Not recognized')
if __name__ == '__main__':
numbers = [10, 4.1, 91.1, 1000]
for number in numbers:
renderer = CompositeRenderer(number)
print(renderer())
'''
OUTPUT:
INTEGER 10
FLOAT 4.1
FLOAT 91.1
INTEGER 1000
'''
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment