Un oggetto come costrutto teorico è molto semplice: è una struttura che memorizza dati, funzioni o entrambi. L'idea è che queste strutture hanno un senso di "io" che è implicito nella maggior parte delle lingue al di fuori di Python. Questo si chiama "descrittore" e fornisce all'oggetto un punto di auto-riferimento che lega i dati (variabili o campi) e le funzioni (in genere chiamati metodi) al particolare oggetto in questione. L'idea è che stai utilizzando specificamente una variabile o un metodo che appartiene a quella particolare istanza (blocco allocato di memoria in genere sotto) piuttosto che a un costrutto più ampio e più generale.
I sistemi a oggetti tendono a variare rispetto a due grandi categorie: Ereditarietà e Accesso.
Alcuni, come Java o C ++, dichiarano le classi che fungono da "schemi" per gli oggetti che poi vengono allocati. Queste classi e i loro oggetti non possono essere strutturalmente modificati una volta istanziati. Possono avere il contenuto ignorato 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 classi parzialmente implementate che fungono da contratti) o creare una sottoclasse per ottenere i metodi o le variabili extra necessari insieme a tutte le variabili e i metodi originali della classe in questione.
Altri linguaggi basati su classi, il più comunemente citato come Ruby, ti consentono di aprire facilmente una classe esistente e di aggiungere semplicemente i metodi che ritieni più adatti. Questo è un osso di contesa e considerato da molti molto, molto pericoloso.
Javascript è ancora più libero, gli oggetti non sono altro che una raccolta 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, trasmettendo così tutte le loro abilità.
Il controllo degli accessi è l'altro grande punto di differenza tra le varie lingue.
Alcuni linguaggi come Java hanno modificatori di accesso molto severi come "privato" e "protetto", che definiscono esattamente quali classi e sottoclassi possono utilizzare una determinata variabile o metodo.
Altri, come Python, sono meno formali, usando la convenzione di un carattere di sottolineatura 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, semplicemente non lo impone in modo rigoroso come alcuni degli altri.