import random class Female(object): pass class Male(object): pass def get_sex(): return [Female, Male][random.randint(0, 1)] class Animal(object): def __init__(self, name, sex=None): self.name = name self.sex = sex or get_sex() def introduction(self): print("I'm '%s' of %s." % (self.name, type(self).__name__)) def can_crossing_to(self, target): return self.sex != target.sex def __add__(self, other): if self.can_crossing_to(other) and type(other) == type(self): return lambda name: type(self)(name) raise Exception("Miss match") class Lion(Animal): def hunting(self): print("Hunt for group") def __add__(self, other): if self.can_crossing_to(other) and type(other) == Tiger: if self.sex == Male: return lambda name: Liger(name) else: return lambda name: Tigon(name) return Animal.__add__(self, other) class Tiger(Animal): def hunting(self): print("Hunt for me") def __add__(self, other): if self.can_crossing_to(other) and type(other) == Lion: if self.sex == Male: return lambda name: Tigon(name) else: return lambda name: Ligon(name) return lambda name: Liger(name) return Animal.__add__(self, other) class Liger(Lion, Tiger): def hunting(self): print("Hunt for ...!") class Tigon(Tiger, Lion): def hunting(self): print("Hunt for ...?") def main(): lion1 = Lion(name="Lion hart") tiger1 = Tiger(name="Tiger uppercut", sex=Male if lion1.sex == Female else Female) hybrid = (lion1 + tiger1)(name="Hybrid super animal") lion1.introduction() lion1.hunting() tiger1.introduction() tiger1.hunting() hybrid.introduction() hybrid.hunting() if __name__ == "__main__": main()