Random date gen class. Returns a tuple of a start date and end date
You thought about using a generator… and why did you reject the idea?  If you have an object that does nothing other than iterating, then you might as well make it a generator — that's exactly what they are for.

The code is generally sound.  In my opinion, it could flow better if you defined the variables in a more logical order: (random year, random month, random day), followed by (random span), then packaging the results.

The meaning of the term parameter is unclear.  I would prefer a more explicit name.  The default value, 5, is unexpected to me.  Choose either:


A "sensible" default of 1 day, because that is a natural lower limit for a hotel stay (unless you run one of those sleazy hotels that rents rooms by the hour)
A default value of 0 days, because 0 is the additive identity
No default at all: make it a required parameter


In any case, it's probably a good idea to handle max_days=0 correctly without crashing.

The docstring is a bit cumbersome, and slightly self-contradictory when it comes to explaining the year parameter.

import calendar
from datetime import date, timedelta
import random

def rand_dates(max_days=1, year=None):
    '''
    Returns a date range as (start_date, end_date) tuple.

    The start date is a random date in the specified year (defaulting
    to the current year).

    The end date is a random date between 1 and max_days (inclusive) after
    the start date.

    Example usage: Picking random check-in and check-out dates for a hotel stay. 
    '''
    while True:
        y = year or date.today().year
        m = random.randint(1, 12)
        d = random.randint(1, calendar.monthrange(y, m)[1])
        days = random.randint(1, max_days) if max_days &gt; 0 else 0
        start_date = date(y, m, d)
        yield start_date, start_date + timedelta(days=days)