puras pura programacion paradigma orientada orden objetos inmutabilidad impuras funciones funcional funcion ejemplos alto python language-agnostic

python - pura - paradigma funcional programacion ejemplos



¿Qué son los objetos de "primera clase"? (5)

¿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?

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


"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.

Encuentra que un objeto como 2 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__'']

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

En Java, por ejemplo, existen 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 type ''int'' objeto type ''int'' , que tiene métodos, atributos y un tipo.

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

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

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


"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 para los objetos, pero no siempre es tan evidente para las funciones, o incluso las 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 en realidad no son objetos de primera clase. Por lo tanto, el código anterior utiliza 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).


De una diapositiva en Estructura e Interpretación de Programas de Computadora , conferencia 2A (1986), que a su vez cita a Christopher Stracey :

Los derechos y privilegios de los ciudadanos de primera clase:

  • Para ser nombrado por variables.
  • Para pasar como argumentos a los procedimientos.
  • Para ser devuelto como valores de procedimientos.
  • Para ser incorporado a las estructuras de datos

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:

  • siendo expresable como un valor literal anónimo
  • ser almacenable en variables
  • ser almacenable en estructuras de datos
  • tener una identidad intrínseca (independiente de cualquier nombre de pila)
  • siendo comparable para la igualdad con otras entidades
  • ser transitable como parámetro de un procedimiento / función
  • ser retornable como resultado de un procedimiento / función
  • siendo constructible en tiempo de ejecución
  • siendo imprimible
  • siendo legible
  • ser transmisible entre procesos distribuidos
  • ser almacenable fuera de los procesos en ejecución

Source

En C ++, las funciones en sí mismas no son objetos de primera clase, sin embargo:

  • Puede anular el operador ''()'', lo que permite tener una función de objeto, que es de primera clase.
  • Los punteros de función son de primera clase.
  • boost bind, lambda y función ofrecen funciones de primera clase

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

Aquí hay 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 denominan 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 quiere decir que "todo es de primera clase"?

El término objeto se puede usar de manera general 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.


IMO esta es una de esas metáforas utilizadas 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, 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. Si podemos hacer el 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.