Skip to content

Instantly share code, notes, and snippets.

@majorz
Created April 9, 2013 01:48
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/5342262 to your computer and use it in GitHub Desktop.
Save majorz/5342262 to your computer and use it in GitHub Desktop.
Using cooperative multiple inheritance
from abc import ABCMeta, abstractmethod
class Renderer(metaclass=ABCMeta):
def __init__(self, entity):
self._entity = entity
@abstractmethod
def __call__(self):
raise TypeError('Not recognized')
class IntRenderer(Renderer):
__type = int
def __call__(self):
if isinstance(self._entity, self.__type):
return self.__render()
else:
return super().__call__()
def __render(self):
return 'INTEGER {}'.format(self._entity)
class FloatRenderer(Renderer):
__type = float
def __call__(self):
if isinstance(self._entity, self.__type):
return self.__render()
else:
return super().__call__()
def __render(self):
return 'FLOAT {}'.format(self._entity)
class CompositeRenderer(
IntRenderer,
FloatRenderer,
):
pass
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