Um objeto como construto teórico é muito simples: é uma estrutura que armazena dados, funções ou ambos. A idéia é que essas estruturas têm um senso de "eu" implícito na maioria das linguagens fora do Python. Isso é chamado de "descritor" e fornece ao objeto um ponto de auto-referência que liga dados (variáveis ou campos) e funções (normalmente chamadas de métodos) ao objeto específico em questão. A idéia é que você esteja usando especificamente uma variável ou método que pertença a essa instância específica (bloco de memória alocado normalmente embaixo), em vez de alguma construção maior e mais geral.
Os sistemas de objetos tendem a variar em relação a duas grandes categorias: herança e acesso.
Alguns, como Java ou C ++, declaram classes que agem como "blueprints" para objetos que depois são alocados. Essas classes e seus objetos não podem ser estruturalmente modificados uma vez instanciados. Eles podem ter seu conteúdo substituído no sentido de que as variáveis podem mudar, mas sua estrutura é estática. Você não pode, por exemplo, adicionar novos métodos ao HashMap em Java. Você pode estender a interface (basicamente classes parcialmente implementadas servindo como contratos) ou criar uma subclasse para obter os métodos ou variáveis extras necessários, juntamente com todas as variáveis e métodos originais da classe em questão.
Outras linguagens baseadas em classes, a mais citada como Ruby, permitem abrir facilmente uma classe existente e apenas adicionar métodos como achar melhor. Este é um ponto de discórdia e considerado por muitos como muito, muito perigoso.
Javascript é ainda mais flexível, objetos não passam de uma coleção de slots para variáveis ou funções. Eles podem ser alterados ou substituídos sempre que o programador sentir necessidade de fazê-lo. Eles podem até ser clonados arbitrariamente como "Protótipos" para outros objetos, passando assim todas as suas habilidades.
O controle de acesso é o outro grande ponto de diferença entre os vários idiomas.
Algumas linguagens como Java possuem modificadores de acesso muito rigorosos, como "private" e "protected", que definem exatamente quais classes e subclasses podem usar uma determinada variável ou método.
Outros, como Python, são menos formais, usando a convenção de um sublinhado antes do método ou nome da variável para indicar que ele é privado.
Por fim, o Python é uma linguagem perfeitamente legítima para programar de maneira orientada a objetos, apenas não a aplica de maneira tão rigorosa quanto algumas outras.