Please see the inline commentary.
Does the existence of an _rdate.params attribute imply that the 'TZID' key is set?
Should not both clauses in this || statement evaluate to True? It seems that for a recurring event, .isValid() should be true as well as (implicitly) a positive number of occurrences should exist.
Note also that a "recurring" event with only one occurrence would validate len() > 0, which may not yield the expected results.
Also note that self.event (the lower-level XML level) and self.get_recurrence_dates() work on two different in-memory representations of the event, allowing for race-conditions. Perhaps it is best to ensure the complete event is read and parsed, which should logically lead to two equals copies.
Yes, it does. According to icalendar code, but I'll add additional check.
RDATE specified additional occurrences. So if there's one RDATE it is recurring event. There can be an event with RDATE but no recurrence rule. So, I think this is correct. I don't get the last paragraph. get_recurrence_dates() also uses self.event.