Un objet en tant que construction théorique est très simple: c'est une structure qui stocke des données, des fonctions ou les deux. L'idée étant que ces structures ont un sens de «soi» qui est implicite dans la plupart des langages en dehors de Python. Ceci est appelé un "descripteur" et donne à l'objet un point d'auto-référence qui lie les données (variables ou champs) et les fonctions (généralement appelées méthodes) à l'objet particulier en question. L'idée étant que vous utilisez spécifiquement une variable ou une méthode qui appartient à cette instance particulière (bloc de mémoire alloué généralement en dessous) plutôt qu'à une construction plus grande et plus générale.
Les systèmes d'objets ont tendance à varier en fonction de deux grandes catégories: l'héritage et l'accès.
Certains, comme Java ou C ++, vous font déclarer des classes qui agissent comme des "plans" pour les objets qui sont ensuite alloués. Ces classes et leurs objets ne peuvent pas être structurellement modifiés une fois instanciés. Leur contenu peut être remplacé dans le sens où les variables peuvent changer mais leur structure est statique. Vous ne pouvez pas, par exemple, ajouter de nouvelles méthodes à HashMap en Java. Vous pouvez étendre l'interface (essentiellement des classes partiellement implémentées servant de contrats) ou créer une sous-classe pour obtenir les méthodes ou variables supplémentaires dont vous avez besoin ainsi que toutes les variables et méthodes d'origine de la classe particulière en question.
D'autres langages basés sur les classes, le plus souvent cité étant Ruby, vous permettent d'ouvrir facilement une classe existante et d'ajouter simplement des méthodes comme bon vous semble. C'est une pomme de discorde et considérée par beaucoup comme très, très dangereuse.
Javascript est encore plus lâche, les objets ne sont rien d'autre qu'une collection d'emplacements pour des variables ou des fonctions. Ils peuvent être modifiés ou remplacés chaque fois que le programmeur en ressent le besoin. Ils peuvent même être arbitrairement clonés en tant que "Prototypes" pour d'autres objets, transmettant ainsi toutes leurs capacités.
Le contrôle d'accès est l'autre gros point de différence entre les différentes langues.
Certains langages comme Java ont des modificateurs d'accès très strictement appliqués comme "privé" et "protégé", qui définissent exactement quelles classes et sous-classes peuvent utiliser une variable ou une méthode donnée.
D'autres, comme Python, sont moins formels, utilisant la convention d'un trait de soulignement avant le nom de la méthode ou de la variable pour indiquer qu'il est privé.
En fin de compte, Python est un langage parfaitement légitime pour programmer de manière orientée objet, il ne l'impose tout simplement pas aussi rigoureusement que certains autres.