"""Implementing OOP""" def make_instance(cls): """Return a new object instance.""" def get_value(name): if name in attributes: return attributes[name] else: value = cls['get'](name) return bind_method(value, instance) def set_value(name, value): attributes[name] = value attributes = {} instance = {'get': get_value, 'set': set_value} return instance def bind_method(value, instance): """Return value or a bound method if value is callable.""" if callable(value): def method(*args): return value(instance, *args) return method else: return value def make_class(attributes, base_class=None): """Return a new class. attributes -- class attributes base_class -- a dispatch dictionary representing a class """ def get_value(name): if name in attributes: return attributes[name] elif base_class is not None: return base_class['get'](name) def set_value(name, value): attributes[name] = value def new(*args): return init_instance(cls, *args) cls = {'get': get_value, 'set': set_value, 'new': new} return cls def init_instance(cls, *args): """Return a new instance of cls, initialized with args.""" instance = make_instance(cls) init = cls['get']('__init__') if init is not None: init(instance, *args) return instance