Un objet en Python ressemble à un objet réel, à quelque chose que vous pouvez voir, toucher.
Prenez par exemple la porte d'entrée de votre maison. Elle a quelques caractéristiques : sa taille, sa couleur, sa composition (est-ce une porte en métal ou en bois ?), etc.
De même, un objet en Python possède ce que l'on appellera des attributs : ce seront des variables qui seront encapsulées dans l'objet : l'objet les amènera avec lui partout où il va, parce que ses attributs font partie de lui-même.
Si notre porte se résumait à une couleur, une taille et une composition, elle ne servirait à rien n'est-ce pas ? Une porte d'entrée, ça s'ouvre, ça se ferme, ça se ferme à clé la nuit ou quand vous êtes parti de chez vous. En fermant à clé votre porte, vous allez en quelque sorte faire accomplir quelques actions à cette porte : se refermer, tourner le verrou. C'est la même chose en Python : chaque objet peut contenir des fonctions (appelées méthodes) qui pourront accomplir des actions diverses.
Pour récapituler, un objet possède des attributs qui définissent ses caractéristiques et des méthodes qui lui permettent d'effectuer des actions.
Un attribut est comparable à une variable interne à l'objet, de même qu'une méthode est comparable à une fonction.
Une classe est une sorte d'usine à objets. Ainsi, notre classe Porte va pouvoir créer autant d'objets de type Porte que nous le voulons. Selon ce que l'on a spécifié à notre usine, les objets sortant de l'usine auront ou non les mêmes attributs et les mêmes méthodes.
En pratique, on dit que notre usine à portes est une classe, que lorsqu'on veut créer une nouvelle porte on instancie un nouvel objet de type Porte.