Quand est-ce que les objets ou autre chose sont considérés comme «de première classe» dans un langage de programmation donné, et pourquoi? En quoi diffèrent-ils des langues où ils ne le sont pas?
ÉDITER. Quand on dit «tout est objet» (comme en Python), veut-il bien dire que «tout est de première classe»?
python
language-agnostic
Federico A. Ramponi
la source
la source
Réponses:
En bref, cela signifie qu'il n'y a aucune restriction sur l'utilisation de l'objet. C'est la même chose que tout autre objet.
Un objet de première classe est une entité qui peut être créée dynamiquement, détruite, transmise à une fonction, renvoyée en tant que valeur et avoir tous les droits comme les autres variables du langage de programmation.
Source .
En C ++, les fonctions elles-mêmes ne sont pas des objets de première classe, cependant:
En C ++, les classes ne sont pas des objets de première classe mais des instances de ces classes le sont. En Python, les classes et les objets sont des objets de première classe. (Voir cette réponse pour plus de détails sur les classes en tant qu'objets).
Voici un exemple de fonctions Javascript de première classe:
// 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 .
Les entités qui ne sont pas des objets de première classe sont appelées objets de seconde classe. Les fonctions en C ++ sont de seconde classe car elles ne peuvent pas être créées dynamiquement.
Concernant l'édition:
Le terme objet peut être utilisé librement et n'implique pas d'être de première classe. Et il serait probablement plus logique d'appeler l'ensemble du concept «entités de première classe». Mais en Python, ils visent à tout rendre de première classe. Je crois que l'intention de la personne qui a fait votre déclaration était de première classe.
la source
"Quand on dit" tout est objet "(comme en Python), veut-il bien dire que" tout est de première classe "?"
Oui.
Tout en Python est un objet approprié. Même les choses qui sont des "types primitifs" dans d'autres langues.
Vous trouvez qu'un objet comme a
2
en fait une interface assez riche et sophistiquée.>>> 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__']
Parce que tout est un objet de première classe en Python, il existe relativement peu de cas spéciaux obscurs.
En Java, par exemple, il existe des types primitifs (int, bool, double, char) qui ne sont pas des objets appropriés. C'est pourquoi Java doit introduire Integer, Boolean, Double et Character comme types de première classe. Cela peut être difficile à enseigner aux débutants - il n'est pas évident de savoir pourquoi à la fois un type primitif et une classe doivent coexister.
Cela signifie également que la classe d'un objet est - elle-même - un objet. Ceci est différent du C ++, où les classes n'ont pas toujours une existence distincte au moment de l'exécution.
Le type de
2
est l'type 'int'
objet, qui a des méthodes, des attributs et un type.>>> type(2) <class 'int'>
Le type d'un type intégré comme
int
est l'type 'type'
objet. Cela a également des méthodes et des attributs.>>> type(type(2)) <class 'type'>
la source
int
. Ainsi les «anciennes» contre «nouvelles classes» (et dans 3, il n'y a plus de classes à l'ancienne).«Première classe» signifie que vous pouvez les opérer de la manière habituelle. La plupart du temps, cela signifie simplement que vous pouvez passer ces citoyens de première classe comme arguments aux fonctions, ou les renvoyer à partir de fonctions.
Cela va de soi pour les objets mais pas toujours aussi évident pour les fonctions, voire les classes:
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
Voici un exemple en C # où les fonctions ne sont en fait pas des objets de première classe. Le code ci-dessus utilise donc une petite solution de contournement (à savoir un délégué générique appelé
Action<>
) pour passer une fonction en tant qu'argument. D'autres langages, comme Ruby, permettent de traiter même les classes et les blocs de code comme des variables normales (ou dans le cas de Ruby, des constantes).la source
D'après une diapositive de Structure et interprétation des programmes informatiques , conférence 2A (1986), qui à son tour cite Christopher Stracey :
Les droits et privilèges des citoyens de première classe:
la source
IMO c'est l'une de ces métaphores utilisées pour décrire les choses dans un langage naturel. Le terme est essentiellement utilisé dans le contexte de la description des fonctions comme des objets de première classe.
Si vous considérez un langage orienté objet, nous pouvons conférer diverses fonctionnalités aux objets, par exemple: l'héritage, la définition de classe, la possibilité de passer à d'autres sections de code (arguments de méthode), la possibilité de stocker dans une structure de données etc. Si nous pouvons faire le idem avec une entité qui n'est normalement pas considérée comme un objet, comme les fonctions dans le cas du script java, ces entités sont considérées comme des objets de première classe.
Première classe signifie essentiellement ici, non traitée comme une seconde classe (avec un comportement dégradé). Essentiellement, les moqueries sont parfaites ou impossibles à distinguer.
la source