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