2011-06-16 16 views
6

En C++ solo hay objetos y clases, donde los objetos son instancias de clases.Objetos vs instancia en python

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

Comprobar this

¿Me equivoco?

EDIT: realmente puede alguien explicar con el ejemplo diferencia del objeto vs ejemplo

EDIT: en Python, todo lo que se heredan de objeto clase & por lo tanto, todo es un objeto (es decir, objeto de objeto clase).

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

Instancia es el nombre utilizado para llamar al objeto de cualquier clase. (A.k. un objeto C++).

Consulte this

+0

¿Está refiriéndose a la clase base python 'object'? – juanchopanza

+0

No. Solo el objeto normal contra instancia – Jibin

Respuesta

16

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

En realidad, esto todavía se llama una clase en Python.Es por eso que se define así:

class Foo(object): 
    pass 

La palabra clave class se utiliza porque el resultado todavía se llama una 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 usarse aquí; más de uno, de hecho.

La razón por la que normalmente se derivan las clases de object es un accidente histórico, pero probablemente valga un detalle. La implementación de objetos original de Python trató las clases definidas por el usuario y los tipos incorporados como tipos de cosas ligeramente diferentes. Luego, el diseñador del lenguaje decidió unificar estos dos conceptos. Como resultado, las clases derivadas de object (o de un descendiente de object) se comportan de forma ligeramente diferente a las clases que son no derivadas de object y se llaman clases de estilo nuevo. clases de estilo antiguo, por el contrario, fueron los definidos como esto:

class Foo: 
    pass 

class Bar(Foo): 
    pass 

Nota éstos no heredan de object o de cualquier otra cosa que se hereda de object. Esto los hace clases de estilo antiguo.

Al trabajar con Python 2.x, sus clases casi siempre deben heredar de object, ya que los objetos de estilo nuevo son más fáciles de usar en varias formas pequeñas pero importantes.

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

Ahora, de vuelta a la materia 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 programas de Python: módulos, funciones y clases. Puede crear una clase usando la palabra clave 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 lo sabes. Crear instancias de objetos similares a llamar a una función, pasando de los valores iniciales y otros parámetros:

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

Detrás de las escenas, esto crea una instancia, a continuación, llama al método de la nueva instancia __init__() inicializarlo. Como todo es un objeto en Python, las instancias de una clase también son objetos.

Una última cosa que quizás quieras saber es que así como las clases son plantillas para construir objetos, entonces es posible tener plantillas para construir clases. Estos se llaman metaclases . La metaclase base se llama type (es decir, una clase ordinaria de estilo nuevo es una instancia de type).

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

para crear su propia metaclase, que derivarla de type así:

class mymeta(type): 
    pass 

metaclases son un tema bastante avanzado Python, así que no voy a entrar en lo que se podría utilizar para o cómo hazlo, pero deberían dejar claro hasta qué punto Python toma el concepto de "todo es un objeto".

+0

+1 Muy bien puesto. – fbmd

6

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

+1

inglés por favor ... con ejemplos sería muy apreciado. – Jibin

+4

No estoy seguro de cuál de mis palabras no es inglés; presumiblemente usted ya sabe lo que significa "instancia", y ["metaclass"] (http://stackoverflow.com/search?q=user%3A20862+ [python] + metaclass) es solo una clase cuyas instancias son clases. –

6

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

class MyClass: 
    data = 1 

mc = MyClass() 

MyClass es una clasey mc es un ejemplo de clase MyClass.


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

+1

+1: Simple y pragmático. – EOL

0

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++, puede pensar que es algo así 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 se define una nueva clase en Python, en realidad está sólo la creación de una nueva instancia de Tipo; cuando crea 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 dinámico. Cuando se define un tipo Toto (mediante la ejecución de una definición de clase — incluso definir un tipo es una cosa tiempo de ejecución, no en tiempo de compilación, como en C++), el intérprete de Python crea una instancia de Type, y la pone en un diccionario (map<string, Object*>, en lenguaje C++) en alguna parte. Cuando el intérprete se encuentra con una declaración como:

x = Toto() 

, que mira hacia arriba Toto en el diccionario: si el Object que se refiere tiene el tipo Type, se construye una nueva instancia de ese objeto, si tiene Tipo Function (las funciones también son objetos), llama a la función. (En términos más generales, un tipo/clase puede ser exigible o no; si el tipo de la Object encontrado en el diccionario bajo Toto es exigible, el intérprete de Python hace lo que el objeto ha definido "llamada" en el sentido Ordenar de. al igual que la sobrecarga operator()() en C++. La sobrecarga de operator()() para Type es construir un nuevo objeto de ese tipo.)

Y sí, si usted viene de una formación clásica — estrictamente procesales, lenguajes estructurados, totalmente compilado, puede ser bastante confuso al primero.

1

Como ha pedido "inglés, por favor", intentaré simplificarlo a costa de los detalles.

Primero ignoremos las clases y las instancias, y solo observemos los objetos.

una pitón objeto contiene datos y funciones, al igual que los objetos en cualquier otro lenguaje de programación orientado a objetos. Las funciones adjuntas a los objetos se llaman 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 se quiere) de cómo construir nuevos objetos. Se dice que los objetos construidos según una descripción de clase pertenecen a esa clase. Un nombre elegante para pertenecer a una clase es ser una instancia de esa clase.

Ahora, anteriormente escribí que en Python todo es un objeto. Bueno, eso vale para cosas como funciones y clases también. Entonces, 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 se puede tratar clases (y funciones) como todo lo demás y, por ejemplo, enviarlos como argumentos a una función, que pueden usarlos para construir nuevos objetos de una clase que no sabía que existían.