Un oggetto come costrutto teorico è molto semplice: è una struttura che memorizza dati, funzioni o entrambi. L'idea è che queste strutture hanno un senso di "sé" che è implicito nella maggior parte delle lingue al di fuori di Python. Questo è chiamato "descrittore" e fornisce all'oggetto un punto di riferimento personale che lega dati (variabili o campi) e funzioni (in genere chiamati metodi) al particolare oggetto in questione. L'idea è che stai usando specificatamente una variabile o un metodo che appartiene a quell'istanza particolare (il blocco di memoria assegnato in genere sottostante) piuttosto che a un costrutto più grande e più generale.
I sistemi oggetto tendono a variare in relazione a due grandi categorie: ereditarietà e accesso.
Alcuni, come Java o C ++, dichiarano classi che fungono da "blueprints" per oggetti che poi vengono allocati. Queste classi e i loro oggetti non possono essere modificati strutturalmente una volta istanziati. Possono avere il contenuto sovrascritto nel senso che le variabili possono cambiare ma la loro struttura è statica. Ad esempio, non è possibile aggiungere nuovi metodi a HashMap in Java. È possibile estendere l'interfaccia (in pratica le classi parzialmente implementate che fungono da contratti) o creare una sottoclasse per ottenere i metodi o le variabili aggiuntivi necessari con tutte le variabili e i metodi originali della particolare classe in questione.
Altre lingue basate sulla classe, la più tipicamente citata essendo Ruby, ti permettono di aprire facilmente una classe esistente e aggiungere solo i metodi come meglio credi. Questo è un pomo della discordia e considerato da molti molto, molto pericoloso.
Javascript è ancora più flessibile, gli oggetti non sono altro che una collezione di slot per variabili o funzioni. Possono essere modificati o sovrascritti ogni volta che il programmatore sente la necessità di farlo. Possono anche essere arbitrariamente clonati come "Prototipi" per altri oggetti, passando così tutte le loro abilità su.
Il controllo degli accessi è l'altro grande punto di differenza tra le varie lingue.
Alcuni linguaggi come Java hanno modificatori di accesso molto rigorosamente applicati come "privato" e "protetto", che definiscono esattamente quali classi e sottoclassi possono usare una determinata variabile o metodo.
Altri, come Python, sono meno formali, usando la convenzione di un trattino basso prima del metodo o del nome della variabile per indicare che è privato.
In definitiva, Python è un linguaggio perfettamente legittimo da programmare in modo orientato agli oggetti, ma non lo applica in modo rigoroso come alcuni degli altri.