Un objeto como construcción teórica es muy simple: es una estructura que almacena datos, funciones o ambos. La idea es que estas estructuras tienen un sentido de "yo" que está implícito en la mayoría de los lenguajes fuera de Python. Esto se llama un "descriptor" y le da al objeto un punto de auto referencia que une datos (variables o campos) y funciones (típicamente llamados métodos) al objeto particular en cuestión. La idea es que está utilizando específicamente una variable o método que pertenece a esa instancia particular (bloque de memoria asignado típicamente debajo) en lugar de a una construcción más grande y más general.
Los sistemas de objetos tienden a variar con respecto a dos grandes categorías: herencia y acceso.
Algunos, como Java o C ++, han declarado clases que actúan como "planos" para los objetos que luego se asignan. Estas clases y sus objetos no pueden modificarse estructuralmente una vez instanciados. Pueden anular sus contenidos en el sentido de que las variables pueden cambiar pero su estructura es estática. No puede, por ejemplo, agregar nuevos métodos a HashMap en Java. Puede ampliar la interfaz (clases implementadas básicamente parcialmente que sirven como contratos) o crear una subclase para obtener los métodos o variables adicionales que necesita junto con todas las variables y métodos originales de la clase en cuestión.
Otros lenguajes basados en clases, el más comúnmente citado es Ruby, le permiten abrir fácilmente una clase existente y simplemente agregar métodos como mejor le parezca. Este es un punto de discusión y muchos lo consideran muy, muy peligroso.
Javascript es incluso más flexible, los objetos no son más que una colección de ranuras para variables o funciones. Se pueden cambiar o sobrescribir siempre que el programador sienta la necesidad de hacerlo. Incluso pueden clonarse arbitrariamente como "Prototipos" para otros objetos, transmitiendo así todas sus habilidades.
El control de acceso es el otro gran punto de diferencia entre los distintos idiomas.
Algunos lenguajes como Java tienen modificadores de acceso estrictamente forzados como "privado" y "protegido", que definen exactamente qué clases y subclases pueden usar una variable o método dado.
Otros, como Python, son menos formales y utilizan la convención de un guión bajo antes del método o el nombre de la variable para indicar que es privado.
En última instancia, Python es un lenguaje perfectamente legítimo para programar de una manera orientada a objetos, simplemente no lo aplica tan rigurosamente como algunos de los otros.