2008-10-28 20 views
129

¿Cuándo se dice que los objetos u otra cosa son de "primera clase" en un lenguaje de programación dado, y por qué? ¿En qué se diferencian de los idiomas donde no lo son?¿Qué son los objetos de "primera clase"?

EDITAR. Cuando uno dice "todo es un objeto" (como en Python), ¿de verdad quiere decir que "todo es de primera clase"?

+1

¿Sería posible migrar a esta pregunta programmers.SE? ¿O sería un inadaptado allí también? Creo que esta pregunta es buena. Simplemente no puedo decir qué foro sería el mejor. –

+10

Votaron para reabrir ... lamentablemente esto realmente parece haber sido cerrado por personas que no programan, claramente está en el tema:/ – djechlin

Respuesta

114

En resumen, significa que no hay restricciones en el uso del objeto. Es lo mismo que cualquier otro objeto.

Un objeto de primera clase es una entidad que se puede crear, destruir, pasar a una función, devolver como valor y tener todos los derechos como otras variables en el lenguaje de programación.

Dependiendo del idioma, esto puede implicar:

  • ser expresable como un valor literal anónimo
  • ser almacenable en las variables
  • siendo almacenable en estructuras de datos
  • que tiene una intrínseca identidad (independientemente de cualquier nombre)
  • siendo comparable para la igualdad con otras entidades
  • ser aceptable como un parámetro a un procedimiento/función
  • ser retornables como el resultado de un procedimiento/función
  • ser construible en tiempo de ejecución
  • ser imprimible
  • ser legible
  • siendo transmisible entre distribuida procesos
  • almacenables fuera de procesos en ejecución

Source.

En C++ Funciones sí mismos no son objetos de primera clase, sin embargo:

  • Puede anular el operador '()' por lo que es posible tener una función de objeto, que es de primera clase.
  • Los punteros de función son de primera clase.
  • impulso se unen, lambda y la función no ofrecen funciones de primera clase

En C++, las clases no son objetos de primera clase, pero las instancias de esas clases son. En Python, tanto las clases y los objetos son objetos de primera clase. (Consulte this answer para obtener más detalles sobre las clases como objetos).

Aquí es un ejemplo de las funciones de primera clase de JavaScript:

// f: function that takes a number and returns a number 
// deltaX: small positive number 
// returns a function that is an approximate derivative of f 
function makeDerivative(f, deltaX) 
{ 
    var deriv = function(x) 
    { 
     return (f(x + deltaX) - f(x))/ deltaX; 
    } 
    return deriv; 
} 
var cos = makeDerivative(Math.sin, 0.000001); 
// cos(0)  ~> 1 
// cos(pi/2) ~> 0 

Source.

Las entidades que no son objetos de primera clase se conocen como objetos de segunda clase. Las funciones en C++ son de segunda clase porque no se pueden crear dinámicamente.

En cuanto a la edición:

EDITAR. Cuando uno dice "todo es un objeto" (como en Python), ¿de verdad significa que "todo es de primera clase"?

El término objeto se puede utilizar sin demasiada importancia y no implica ser de primera clase. Y probablemente tendría más sentido llamar a todo el concepto 'entidades de primera clase'. Pero en Python apuntan a hacer que todo sea de primera clase. Creo que la intención de la persona que hizo su declaración fue de primera clase.

+0

¿Puedes dar algunos ejemplos de objetos que no son de "primera clase"? –

15

"Primera clase" significa que puede operar en ellos de la manera habitual. La mayoría de las veces, esto solo significa que puede pasar estos ciudadanos de primera clase como argumentos a funciones, o devolverlos de funciones.

Esto es evidente por sí mismo para los objetos, pero no siempre tan evidente para las funciones, o incluso clases:

void f(int n) { return n * 2; } 

void g(Action<int> a, int n) { return a(n); } 

// Now call g and pass f: 

g(f, 10); // = 20 

Este es un ejemplo en C# donde las funciones realmente no son objetos de primera clase. Por lo tanto, el código anterior usa una pequeña solución (es decir, un delegado genérico llamado Action<>) para pasar una función como argumento. Otros lenguajes, como Ruby, permiten tratar incluso clases y bloques de código como variables normales (o en el caso de Ruby, constantes).

1

IMO esta es una de esas metáforas que se usan para describir las cosas en un lenguaje natural. El término se usa esencialmente en el contexto de describir funciones como objetos de primera clase.

Si considera un lenguaje orientado a objetos, podemos impartir varias características a los objetos para, por ejemplo: herencia, definición de clase, capacidad de pasar a otras secciones de código (argumentos de método), capacidad de almacenar en una estructura de datos, etc. podemos hacer lo mismo con una entidad que normalmente no se considera un objeto, como funciones en el caso del script java, dichas entidades se consideran objetos de primera clase.

La primera clase esencialmente aquí significa, no manejada como segunda clase (con comportamiento degradado). Esencialmente, la burla es perfecta o indistinguible.

12

"Cuando uno dice" todo es un objeto "(como en Python), ¿de verdad quiere decir que" todo es de primera clase "?

Sí.

Todo en Python es un objeto adecuado. Incluso cosas que son "tipos primitivos" en otros idiomas.

Encuentras que un objeto como 2 en realidad tiene una interfaz bastante rica y sofisticada.

>>> dir(2) 
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__'] 

Porque todo es un objeto de primera clase en Python, hay relativamente pocos casos especiales oscuros.

En Java, por ejemplo, hay tipos primitivos (int, bool, double, char) que no son objetos propios.Es por eso que Java tiene que introducir Integer, Boolean, Double y Character como tipos de primera clase. Esto puede ser difícil de enseñar a los principiantes, no es obvio por qué tanto un tipo primitivo como una clase tienen que existir uno al lado del otro.

También significa que la clase de un objeto es, en sí misma, un objeto. Esto es diferente de C++, donde las clases no siempre tienen una existencia distinta en el tiempo de ejecución.

El tipo de 2 es el objeto , que tiene métodos, atributos y un tipo.

>>> type(2) 
<type 'int'> 

El tipo de un tipo incorporado como int es el objeto type 'type'. Esto tiene métodos y atributos, también.

>>> type(type(2)) 
<type 'type'> 
+1

Esto es cierto para Python moderno. En la versión anterior de Python (la versión 1 era anterior a la mía), no se podía heredar de 'int'. Así, las "viejas" contra las "nuevas clases de estilo" (y en 3, ya no hay clases de estilo antiguo). –

12

de una diapositiva en Structure and Interpretation of Computer Programs, 2A conferencia (1986), que a su vez cita Christopher Stracey:

Los derechos y privilegios de ciudadanos de primera clase:

  • ser nombrado por variables
  • Pasar como argumentos a los procedimientos.
  • Se devolverá como valores de procedimientos.
  • a incorporar en las estructuras de datos
Cuestiones relacionadas