Hi Lorcan, Mabye thinking of it like this will help: birds and fishes (I love that word, even if it is incorrect) can _do_ all the things that all animals have in common: eat, drink, die, reproduce, &c; but that is generic.
class animal(object): def eat(self, food): pass ... class bird(animal): pass class fish(animal): pass If you want to talk about a specific bird or fish, then you have to say more than just that it is an animal. Now, if all animals have a weight and a color, but not all have the same weight or color, then you want to say that this bird or fish is an animal which is colored X and weighes Y. class animal(object): def __init__(self, weight, colour): self.weight = weight self.colour = colour class bird(animal): pass # __init__ from animal is called implicitly class fish(animal): pass Now what if a bird and a fish have other attributes that not all animals share (or at least specialized versions)? Well then you need to say this bird is an animal which is colored X and weighs Y, but unlike other animals, has a wingspan or length of Z. class animal(object): def __init__(self, weight, colour): self.weight = weight self.colour = colour class bird(animal): # override __init__ so we can say what _this_ animal is like def __init__(self, weight, color, wingspan): super(bird, self).__init__(weight, color) self.wingspan = wingspan class fish(animal): def __init__(self, weight, color, length): super(fish, self).__init__(weight, color) self.length = length Does this make more sense? Regards, Jordan -- http://mail.python.org/mailman/listinfo/python-list