Objetos vs instancia en Python

En C ++ solo hay objetos y clases, donde los objetos son instancias de clases.

En Python, una definición de clase (es decir, el cuerpo de una clase) se llama un objeto. Y, el objeto en C ++ se llama instancia en python.

Mira esto

¿Me equivoco?

EDITAR: En realidad, alguien puede explicar con ejemplo la diferencia de objeto frente a instancia

EDITAR: En Python, todo se heredará de la clase de objeto y, por lo tanto, todo es un objeto (es decir, el objeto de la clase de objeto ).

Una clase también es un objeto (es decir, el objeto de la clase de objeto ).

Instancia es el nombre que se usa para llamar al objeto de cualquier clase (también conocido como objeto c ++).

Por favor refiérase a esto

En Python, una definición de clase (es decir, el cuerpo de una clase) se llama un objeto

En realidad, esto todavía se llama una clase en Python. Por eso lo definen así:

 class Foo(object): pass 

La palabra clave de class se usa porque el resultado todavía se llama clase.

La palabra object está entre paréntesis para mostrar que Foo se deriva de la clase llamada object . No se confunda, cualquier clase existente podría ser usada aquí; más de uno, de hecho.

La razón por la que usualmente derivas clases de un object es un accidente histórico, pero probablemente vale la pena un detalle. La implementación del objeto original de Python trató las clases definidas por el usuario y los tipos incorporados como tipos de cosas ligeramente diferentes. Entonces el diseñador del lenguaje decidió unificar estos dos conceptos. Como resultado, las clases derivadas de un object (o de un descendiente de un object ) se comportan de forma ligeramente diferente a las clases que no derivan de un object y se denominan clases de nuevo estilo. Las clases de estilo antiguo, por otro lado, fueron definidas así:

 class Foo: pass class Bar(Foo): pass 

Tenga en cuenta que estos no heredan de un object o de cualquier otra cosa que herede de un object . Esto hace que sean clases de estilo antiguo.

Al trabajar con Python 2.x, sus clases casi siempre deben heredar de un object , ya que los objetos de estilo nuevo son más agradables para trabajar de varias maneras pequeñas pero importantes.

Para confundir aún más las cosas, en Python 3.0 y versiones posteriores, no hay clases de estilo antiguo, por lo que no tiene que derivar explícitamente del object . En otras palabras, todas las clases anteriores serían clases de estilo nuevo en Python 3.x.

Ahora, volviendo al asunto en cuestión. Las clases son objetos porque todo es un objeto en Python. Listas, diccionarios, enteros, cadenas, tuplas … todos estos son objetos, y también lo son los componentes básicos de los progtwigs de Python: módulos, funciones y clases. Puede crear una clase usando la palabra clave de class y luego pasarla a una función, modificarla, etc. (Para completar, también puede crear una clase usando la función type() ).

Una clase es una plantilla para construir objetos, que se conocen como instancias. Esta parte ya la conoces. Usted instancia objetos similares a llamar a una función, pasando los valores iniciales y otros parámetros:

 mylist = list("abc") # constructs ["a", "b", "c"] 

Detrás de escena, esto crea una instancia, luego llama al método __init__() la nueva instancia para inicializarla. Como todo es un objeto en Python, las instancias de una clase también son objetos.

Una última cosa que quizás desee saber es que, al igual que las clases, son plantillas para construir objetos, también es posible tener plantillas para crear clases. Estos se llaman metaclases. La metaclase base se llama type (es decir, una clase de estilo nuevo ordinario es una instancia de type ).

(Sí, este es el mismo type que mencioné anteriormente se puede usar para crear clases, y la razón por la que puede llamarlo para crear clases es que es una metaclase).

Para crear su propia metaclase, la deriva de un type así:

 class mymeta(type): pass 

Las metaclases son un tema bastante avanzado de Python, por lo que no voy a entrar en lo que podrías usar o cómo hacerlo, pero deberían aclarar hasta qué punto Python lleva el concepto de “todo es un objeto”.

Todo en Python es un objeto. Incluso las clases, que son instancias de metaclases .

En cuanto a la terminología, las clases y las instancias se denominan objetos en Python, pero para usted, como progtwigdor regular de Python, esto no tiene importancia. Puede ver las clases e instancias de Python más o menos como las clases e instancias de C ++:

 class MyClass: data = 1 mc = MyClass() 

MyClass es una clase y mc es una instancia de la clase MyClass .


Sin embargo, Python es mucho más dynamic en naturaleza que C ++, por lo que sus clases también son objetos. Pero esto no es algo a lo que los progtwigdores suelen estar expuestos, por lo que no puede preocuparse por eso.

En un sentido muy real, todo en Python es un objeto: una clase (o cualquier tipo) es un objeto, una función es un objeto, un número es un objeto … Y cada objeto tiene un tipo. Un “tipo” es un tipo particular de objeto (una clase, si lo desea), con datos adicionales que describen los diversos atributos del tipo (funciones, etc.). Si estás acostumbrado a C ++, puedes considerarlo como algo como:

 struct Type; struct Object // The base class of everything. { Type* myType; // Some additional stuff, support for reference counting, etc. }; struct Type : Object { // Lots of additional stuff defining type attributes... }; 

Cuando define una nueva clase en Python, en realidad está creando una nueva instancia de Type; cuando myType una instancia de esa clase, Python inicializa el miembro myType con un puntero a la instancia correcta de Type .

Tenga en cuenta, sin embargo, que todo es dynamic. Cuando define un tipo Toto (ejecutando una definición de clase, incluso definir un tipo es una cosa de tiempo de ejecución, no tiempo de comstackción, como en C ++), el intérprete de Python crea una instancia de Type y la coloca en un diccionario ( map , en lenguaje C ++) en alguna parte. Cuando el intérprete encuentra una statement como:

 x = Toto() 

, busca Toto en el diccionario: si el Object hace referencia tiene el tipo Type , construye una nueva instancia de ese objeto, si tiene el Tipo Function (las funciones también son objetos), llama a la función. (Más generalmente, un tipo / clase puede ser invocable o no; si el tipo de Object encontrado en el diccionario bajo Toto es invocable, el intérprete de Python hace lo que el objeto ha definido como “llamada” para significar. Tipo de operator()() sobrecarga similar operator()() en C ++. La sobrecarga del operator()() para Type es construir un nuevo objeto de ese tipo.)

Y sí, si proviene de un fondo clásico: lenguajes estrictamente procedimentales, estructurados y totalmente comstackdos, puede ser bastante confuso al principio.

Ya que pidió “inglés por favor”, intentaré hacerlo simple a costa de los detalles.

Ignoremos clases e instancias al principio, y solo miremos los objetos.

Un objeto de Python contiene datos y funciones , al igual que los objetos en cualquier otro lenguaje de progtwigción orientado a objetos. Las funciones asociadas a los objetos se denominan métodos .

 x = "hello" #now x is an object that contains the letters in "hello" as data print x.size() #but x also has methods, for example size() print "hello".size() #In python, unlike C++, everything is an object, so a string literal has methods. print (5).bit_length() #as do integers (bit_length only works in 2.7+ and 3.1+, though) 

Una clase es una descripción (o una receta, si lo desea) de cómo construir nuevos objetos. Los objetos construidos de acuerdo con una descripción de clase se dice que pertenecen a esa clase. Un nombre elegante para pertenecer a una clase es ser una instancia de esa clase.

Ahora, antes escribí que en Python todo es un objeto. Bueno, eso vale para cosas como funciones y clases también. Así que una descripción de cómo hacer nuevos objetos es en sí misma un objeto.

 class C: #C is a class and an object a = 1 x1 = C() #x1 is now an instance of C print x1.a #and x1 will contain an object a y = C #Since C is itself an object, it is perfectly ok to assign it to y, note the lack of () x2 = y() #and now we can make instances of C, using y instead. print x2.a #x2 will also contain an object a print C #since classes are objects, you can print them print y #y is the same as C. print y == C #really the same. print y is C #exactly the same. 

Esto significa que puede tratar las clases (y las funciones) como todo lo demás y, por ejemplo, enviarlas como argumentos a una función, que puede usarlas para construir nuevos objetos de una clase que nunca supo que existían.