Building CPython

Marko Rauhamaa marko at pacujo.net
Sun May 17 16:49:15 EDT 2015


Iterating. A line still missing:

> ========================================================================
> ### Simple OO Framework
>
> class _O: pass
>
> def make_object(*procedures, base=None, bases=None):
>     o = _O()
>     methods = {}
>     o.__methods__ = methods
>     o.__derived__ = None
>     if base is not None:
>         _inherit_single(o, base)
>     elif bases is not None:
>         _inherit_multi(o, bases)
>     for procedure in procedures:
>         methods[procedure.__name__] = procedure
>         def method(*args, __procedure__=procedure, __dispatch__=True, **kwargs):
>             if not __dispatch__ or o.__derived__ is None:
>                 return __procedure__(*args, **kwargs)
>             derived = o
>             while derived.__derived__ is not None:
>                 derived = derived.__derived__
>             return getattr(derived, __procedure__.__name__)(*args, **kwargs)
>         setattr(o, procedure.__name__, method)
>     return o
>
> def _inherit_single(o, base):
>     methods = o.__methods__
>     for name, method in base.__methods__.items():
>         methods[name] = method
>         setattr(o, name, method)
      base.__derived__ = o
>
> def _inherit_multi(o, bases):
>     for base in bases:
>         _inherit_single(o, base)
>
> def delegate(method, *args, **kwargs):
>     return method(*args, __dispatch__=False, **kwargs)
>
> ### Used as follows
>
> def TCPClient():
>     def connect(address):
>         pass
>     def shut_down():
>         pass
>     return make_object(connect, shut_down)
>
> def SMTPClient():
>     tcp_client = TCPClient()
>     def connect(address):
>         delegate(tcp_client.connect, address)
>         do_stuff()
>     def send_message(message):
>         pass
>     return make_object(connect, send_message, base=tcp_client)
>
> client = SMTPClient()
> client.connect(None)
> ========================================================================



More information about the Python-list mailing list