class Delegator:
   def __init__(self):
      self.delegate = None
   def operation(self):
       if hasattr(self.delegate, 'thing') and callable(self.delegate.thing):
          return self.delegate.thing()
       return 'default implementation'
 
class Delegate:
   def thing(self):
      return 'delegate implementation'
 
if __name__ == '__main__':
 
   # No delegate
   a = Delegator()
   assert a.operation() == 'default implementation'
 
   # With a delegate that does not implement "thing"
   a.delegate = 'A delegate may be any object'
   assert a.operation() == 'default implementation'
 
   # With delegate that implements "thing"
   a.delegate = Delegate()
   assert a.operation() == 'delegate implementation'