Author class, with constructor validations and rich comparisons
Personally using a namedtuple is the best way to strip most of your code.

If you wish to be able to mutate your data, then inheriting from a list, rather than namedtuple, could be a better idea.
I'm not a fan of _validateid or _validate_author, just write them out in the constructor.


And so I'd personally change your code to:

from collection import namedtuple

class Author(namedtuple('AuthorBase', 'id first_name last_name')):
    def __new__(cls, id, first, last):
        if id &lt; 1:
            raise ValueError('id is not a valid id')
        if not first:
            raise ValueError('first_name has not been set')
        if not last:
            raise ValueError('last_name has not been set')
        return super().__new__(cls, id, first, last)