Cosa sono gli oggetti di "prima classe"?


192

Quando si dice che oggetti o qualcos'altro sono "di prima classe" in un determinato linguaggio di programmazione e perché? In cosa differiscono dalle lingue in cui non sono?

MODIFICARE. Quando si dice "tutto è un oggetto" (come in Python), significa davvero che "tutto è di prima classe"?


1
Sarebbe possibile migrare questa domanda su programmers.SE? O sarebbe un disadattato anche lì? Penso che questa domanda sia buona. Non riesco proprio a dire quale forum si adatterebbe meglio.
Shashank Sawant,

16
Votato per riaprire ... purtroppo sembra davvero chiuso da persone che non programmano, è chiaramente in tema: /
djechlin

Risposte:


177

In breve, significa che non ci sono restrizioni sull'uso dell'oggetto. È uguale a qualsiasi altro oggetto.

Un oggetto di prima classe è un'entità che può essere creata, distrutta, passata a una funzione in modo dinamico, restituita come valore e avere tutti i diritti come altre variabili nel linguaggio di programmazione.

A seconda della lingua, ciò può implicare:

  • essere espressibile come valore letterale anonimo
  • essendo memorizzabile in variabili
  • essere memorizzabile in strutture dati
  • avere un'identità intrinseca (indipendente da qualsiasi nome)
  • essere comparabili per l'uguaglianza con altre entità
  • essere passabile come parametro a una procedura / funzione
  • essere restituibile come risultato di una procedura / funzione
  • essendo costruibile in fase di esecuzione
  • essere stampabile
  • essere leggibile
  • essere trasmissibile tra i processi distribuiti
  • essere memorizzabile al di fuori dei processi in esecuzione

Fonte .

In C ++ le funzioni stesse non sono oggetti di prima classe, tuttavia:

  • È possibile ignorare l'operatore '()' rendendo possibile avere una funzione oggetto, che è di prima classe.
  • I puntatori a funzione sono di prima classe.
  • boost bind, lambda e function offrono funzioni di prima classe

In C ++, le classi non sono oggetti di prima classe ma le istanze di tali classi lo sono. In Python sia le classi che gli oggetti sono oggetti di prima classe. (Vedi questa risposta per maggiori dettagli sulle classi come oggetti).

Ecco un esempio delle funzioni di prima classe di 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

Fonte .

Le entità che non sono oggetti di prima classe vengono denominate oggetti di seconda classe. Le funzioni in C ++ sono di seconda classe perché non possono essere create dinamicamente.

Per quanto riguarda la modifica:

MODIFICARE. Quando si dice "tutto è un oggetto" (come in Python), significa davvero che "tutto è di prima classe"?

Il termine oggetto può essere usato liberamente e non implica essere di prima classe. E probabilmente avrebbe più senso chiamare l'intero concetto "entità di prima classe". Ma in Python mirano a rendere tutto di prima classe. Credo che l'intento della persona che ha fatto la tua dichiarazione abbia significato prima classe.


2
Puoi fornire alcuni esempi di oggetti che non sono di "prima classe"?
Sudip Bhandari,

1
@SudipBhandari Mi chiedevo la stessa cosa, alla fine mi sono imbattuto nell'utile articolo di Wikipedia su questo argomento: cittadino / oggetto di prima classe . Ho trovato la definizione di Robin Popplestone particolarmente utile. (A proposito, pubblicare un articolo sul WP può sembrare super ovvio ma non mi rendevo conto che si trattava di un concetto di linguaggio di programmazione fondamentale)
mblakesley,

19

"Quando si dice" tutto è un oggetto "(come in Python), significa davvero che" tutto è di prima classe "?"

Sì.

Tutto in Python è un oggetto appropriato. Anche cose che sono "tipi primitivi" in altre lingue.

Scoprite che un oggetto come in 2realtà ha un'interfaccia abbastanza ricca e sofisticata.

>>> 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__']

Poiché tutto è un oggetto di prima classe in Python, ci sono relativamente pochi casi speciali oscuri.

In Java, ad esempio, ci sono tipi primitivi (int, bool, double, char) che non sono oggetti propri. Ecco perché Java deve introdurre Integer, Boolean, Double e Character come tipi di prima classe. Questo può essere difficile da insegnare ai principianti - non è ovvio perché sia ​​un tipo primitivo che una classe debbano esistere fianco a fianco.

Significa anche che la classe di un oggetto è - di per sé - un oggetto. Questo è diverso dal C ++, in cui le classi non hanno sempre un'esistenza distinta in fase di esecuzione.

Il tipo di 2è l' type 'int'oggetto, che ha metodi, attributi e un tipo.

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

Il tipo di un tipo incorporato come intè l' type 'type'oggetto. Questo ha anche metodi e attributi.

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

1
Questo è vero per il moderno Python. Nel vecchio Python (versione 1? Era prima del mio tempo) da cui non potevi ereditare int. Quindi le "vecchie" contro "nuove classi di stile" (e in 3, non ci sono più classi di vecchio stile).
Keith Pinson,

17

"Prima classe" significa che puoi operare su di loro nel solito modo. Il più delle volte, questo significa solo che puoi passare questi cittadini di prima classe come argomenti alle funzioni o restituirli dalle funzioni.

Questo è evidente per gli oggetti, ma non sempre così evidente per le funzioni o persino le classi:

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

Questo è un esempio in C # in cui le funzioni in realtà non sono oggetti di prima classe. Il codice precedente utilizza quindi una soluzione alternativa (vale a dire un delegato generico chiamato Action<>) per passare una funzione come argomento. Altre lingue, come Ruby, consentono di trattare anche le classi e i blocchi di codice come variabili normali (o nel caso di Ruby, costanti).



1

IMO questa è una di quelle metafore usate per descrivere le cose in un linguaggio naturale. Il termine viene utilizzato essenzialmente nel contesto della descrizione delle funzioni come oggetti di prima classe.

Se si considera un linguaggio orientato agli oggetti, possiamo impartire varie funzioni agli oggetti, ad esempio: ereditarietà, definizione della classe, capacità di passare ad altre sezioni di codice (argomenti del metodo), capacità di memorizzare in una struttura di dati ecc. Se possiamo fare il lo stesso con un'entità che normalmente non viene considerata come un oggetto, come le funzioni nel caso di script Java, tali entità sono considerate oggetti di prima classe.

Prima classe essenzialmente qui significa, non gestita come seconda classe (con comportamento degradato). Essenzialmente il beffardo è perfetto o indistinguibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.