¿Qué tienen en común los candidatos presidenciales y el lenguaje Python? Mucho más de lo que usted cree

Al menos Python es más fácil de entender :-). También me dió un excusa para mostrarles un poco de herencia y otros trucos de objetos en el lenguaje:

#!/usr/bin/env python3
# A little fun with the candidates for the US presidency for 2016 election year
# @author josevnz@kodegeek.com
#
class Candidate:
    
    def __init__(self, name, party, sex="F", age=18):
        self.__name = name
        self.__party = party
        self.__sex = "F" if sex not in ["M", "F"] else sex
        self.__age = 18 if not (18 < = age <= 120) else age
    
    @property
    def name(self):
        return self.__name
    
    @property
    def party(self):
        return self.__party
    
    @property
    def sex(self):
        return self.__sex
    
    @property
    def age(self):
        return self.__age
    
    def __hash__(self):
        return hash(id(self))
    
    def __str__(self):
        return "Candidate=[name={0}, party={1}, sex={2}, age={3}]".format(
                                                                      self.__name,
                                                                      self.__party,
                                                                      self.__sex,
                                                                      self.__age
                                                                      )
    
    def __repr__(self):
        return "{0}{1}{2}{3}{4}".format(
                                        self.__class__.__name__, 
                                        self.__name, 
                                        self.__party, 
                                        self.__sex, 
                                        self.__age
                                        )
    
    def __invert__(self):
        raise NotImplemented()
    
    # Are you a Democrat?    
    def __bool__(self):
        raise NotImplemented()
    
    def __lt__(self, other):
        return self.__age < other.__age
    
    def __gt__(self, other):
        return self.__age > other.__age
    
    def __eq__(self, other):
        return (
                self.__age == other.__age and 
                self.__name == other.__name and 
                self.__party == other.__party and 
                self.__sex == other.__sex
                )

class Republican(Candidate):
    
    def __init__(self, name, sex="F", age=21):
        return super().__init__(name, "Republican party", sex, age)
    
    def __bool__(self):
        return False
    
    def __invert__(self):
        raise NotImplementedError()
            
class Democrat(Candidate):
    
    def __init__(self, name, sex="F", age=21):
        return super().__init__(name, "Democratic party", sex, age)
    
    def __bool__(self):
        return True
    
    def __invert__(self):
        raise NotImplementedError()
    
if __name__ == "__main__":
        candidates = []
        candidates.append(Democrat("Hillary Clinton", "F", 68))
        candidates.append(Republican("Donald Trump", "M", 70))
        candidates.append(Democrat("Bernie Sanders", "M", 75))
        candidates.append(Republican("Marco Rubio", "M", 45))
        for candidate in sorted(candidates, reverse=True):
            isDemocrat = "yes" if candidate else "no"
            print("Candidate: {0}, democrat? {1}".format(candidate, isDemocrat))        

And the output for this run:

Candidate: Candidate=[name=Bernie Sanders, party=Democratic party, sex=M, age=75], democrat? yes
Candidate: Candidate=[name=Donald Trump, party=Republican party, sex=M, age=70], democrat? no
Candidate: Candidate=[name=Hillary Clinton, party=Democratic party, sex=F, age=68], democrat? yes
Candidate: Candidate=[name=Marco Rubio, party=Republican party, sex=M, age=45], democrat? no

Ahora si sólo pudiera escribir algo tan sencillo como esto para saber los resultados de las elecciones del 2016 🙂