Building CPython
Marko Rauhamaa
marko at pacujo.net
Sat May 16 18:51:08 EDT 2015
Marko Rauhamaa <marko at pacujo.net>:
> Ok, here's a quick port that have barely tried out:
And here's a more complete port (with some possible dunder abuse):
========================================================================
### 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)
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)
========================================================================
Marko
More information about the Python-list
mailing list