"I really wish the language had private inheritance because I'm using Abstract as a base just for code reuse"
Funny you should say that. . . what about a __nonconformant__ entry that accepts a list of base classes that is used to indicate inheritance without a proper is-a relationship?
So if the isinstance check succeeds and there is no '__nonconformant__' entry, then adapt() just returns the object.
If, on the other hand, __nonconformant__ is supplied, then adapt() can check the list of base classes that remains after removing the entries in __nonconformant__ to see if the object would *still* be an instance a subtype, even after removing the noncomformant bases, and if it is, return it.
Otherwise, continue on to the rest of the adaptation process.
This should give a better idea what I mean:
# The 'fast path'
if isinstance(obj, protocol):
if not hasattr(obj, "__nonconformant__"):
return obj
conformant_bases = set(obj.__bases__) - set(obj.__nonconformant__)
for base in conformant_bases:
if issubtype(base, protocol):
return obj
# Continue on with the other adaptation possibilities (including __conform__)Then you can get 'discreet' inheritance (you have the methods, but you don't brag about the fact) by writing:
class Dubious(Abstract): __noncomformant__ = [Abstract] # etc
rather than:
class Dubious(Abstract):
def __comform__(self, protocol):
if issubtype(protocol, Abstract):
raise LiskovViolation
# etcRegards, Nick.
--
Nick Coghlan | [EMAIL PROTECTED] | Brisbane, Australia
---------------------------------------------------------------
http://boredomandlaziness.skystorm.net
--
http://mail.python.org/mailman/listinfo/python-list
