Alex Martelli wrote:
"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
  # etc

Regards,
Nick.

--
Nick Coghlan   |   [EMAIL PROTECTED]   |   Brisbane, Australia
---------------------------------------------------------------
            http://boredomandlaziness.skystorm.net
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to