Was sind erstklassige Objekte?

191

Wann werden Objekte oder etwas anderes in einer bestimmten Programmiersprache als "erstklassig" bezeichnet und warum? Worin unterscheiden sie sich von Sprachen, in denen sie nicht sind?

BEARBEITEN. Wenn man sagt "alles ist ein Objekt" (wie in Python), meint er dann tatsächlich, dass "alles erstklassig ist"?

Federico A. Ramponi
quelle
1
Wäre es möglich, diese Frage an programmers.SE zu migrieren? Oder wäre es dort auch ein Außenseiter? Ich finde diese Frage gut. Ich kann nur nicht sagen, welches Forum am besten dazu passt.
Shashank Sawant
16
Zur Wiedereröffnung gewählt ... leider scheint dies wirklich so, als ob es von Leuten geschlossen wurde, die nicht programmieren. Es ist eindeutig ein Thema: /
Djechlin

Antworten:

176

Kurz gesagt bedeutet dies, dass die Verwendung des Objekts nicht eingeschränkt ist. Es ist das gleiche wie bei jedem anderen Objekt.

Ein erstklassiges Objekt ist eine Entität, die dynamisch erstellt, zerstört, an eine Funktion übergeben, als Wert zurückgegeben werden kann und über alle Rechte verfügt, die andere Variablen in der Programmiersprache haben.

Je nach Sprache kann dies Folgendes bedeuten:

  • als anonymer wörtlicher Wert ausdrückbar sein
  • in Variablen speicherbar sein
  • in Datenstrukturen speicherbar sein
  • eine intrinsische Identität haben (unabhängig von einem bestimmten Namen)
  • für die Gleichstellung mit anderen Unternehmen vergleichbar sein
  • als Parameter für eine Prozedur / Funktion passierbar sein
  • als Ergebnis einer Prozedur / Funktion zurückgegeben werden
  • zur Laufzeit konstruierbar sein
  • druckbar sein
  • lesbar sein
  • zwischen verteilten Prozessen übertragbar sein
  • außerhalb laufender Prozesse speicherbar sein

Quelle .

In C ++ sind Funktionen selbst jedoch keine erstklassigen Objekte:

  • Sie können den Operator '()' überschreiben, um eine erstklassige Objektfunktion zu erhalten.
  • Funktionszeiger sind erstklassig.
  • Boost Bind, Lambda und Function bieten erstklassige Funktionen

In C ++ sind Klassen keine erstklassigen Objekte, sondern Instanzen dieser Klassen. In Python sind sowohl die Klassen als auch die Objekte erstklassige Objekte. ( Weitere Informationen zu Klassen als Objekte finden Sie in dieser Antwort .)

Hier ist ein Beispiel für erstklassige Javascript-Funktionen:

// 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

Quelle .

Entitäten, die keine erstklassigen Objekte sind, werden als Objekte zweiter Klasse bezeichnet. Funktionen in C ++ sind zweitklassig, da sie nicht dynamisch erstellt werden können.

In Bezug auf die Bearbeitung:

BEARBEITEN. Wenn man sagt "alles ist ein Objekt" (wie in Python), meint er dann tatsächlich, dass "alles erstklassig ist"?

Der Begriff Objekt kann lose verwendet werden und bedeutet nicht, erstklassig zu sein. Und es wäre wahrscheinlich sinnvoller, das gesamte Konzept als "erstklassige Entitäten" zu bezeichnen. Aber in Python wollen sie alles erstklassig machen. Ich glaube, die Absicht der Person, die Ihre Aussage gemacht hat, bedeutete erstklassig.

Brian R. Bondy
quelle
2
Können Sie einige Beispiele für Objekte nennen, die nicht "erstklassig" sind?
Sudip Bhandari
1
@SudipBhandari Ich habe mich das Gleiche gefragt und bin schließlich auf den hilfreichen Wikipedia-Artikel zu diesem Thema gestoßen: erstklassiger Bürger / Objekt . Ich fand Robin Popplestones Definition besonders hilfreich. (Übrigens, das Posten eines WP-Artikels mag sehr offensichtlich erscheinen, aber ich wusste nicht, dass dies ein grundlegendes Programmiersprachenkonzept ist)
mblakesley
19

"Wenn man sagt" alles ist ein Objekt "(wie in Python), meint er dann tatsächlich, dass" alles erstklassig ist "?"

Ja.

Alles in Python ist ein richtiges Objekt. Sogar Dinge, die in anderen Sprachen "primitive Typen" sind.

Sie finden, dass ein Objekt wie 2tatsächlich eine ziemlich reichhaltige und ausgefeilte Oberfläche hat.

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

Da in Python alles ein erstklassiges Objekt ist, gibt es relativ wenige undurchsichtige Sonderfälle.

In Java gibt es beispielsweise primitive Typen (int, bool, double, char), die keine richtigen Objekte sind. Deshalb muss Java Integer, Boolean, Double und Character als erstklassige Typen einführen. Anfängern kann dies schwer beizubringen sein - es ist nicht offensichtlich, warum sowohl ein primitiver Typ als auch eine Klasse nebeneinander existieren müssen.

Dies bedeutet auch, dass die Klasse eines Objekts - selbst - ein Objekt ist. Dies unterscheidet sich von C ++, wo die Klassen zur Laufzeit nicht immer eine bestimmte Existenz haben.

Der Typ von 2ist das type 'int'Objekt, das Methoden, Attribute und einen Typ enthält.

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

Der Typ eines eingebauten Typs wie intist das type 'type'Objekt. Dies hat auch Methoden und Attribute.

>>> type(type(2))
<class 'type'>
S.Lott
quelle
1
Dies gilt für das moderne Python. In altem Python (Version 1? Es war vor meiner Zeit) konnte man nicht erben int. Also die "alten" versus "neuen" Klassen (und in 3 gibt es keine alten Klassen mehr).
Keith Pinson
17

"First Class" bedeutet, dass Sie sie auf die übliche Weise bearbeiten können. In den meisten Fällen bedeutet dies nur, dass Sie diese erstklassigen Bürger als Argumente an Funktionen übergeben oder von Funktionen zurückgeben können.

Dies ist für Objekte selbstverständlich, für Funktionen oder sogar Klassen jedoch nicht immer so offensichtlich:

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

Dies ist ein Beispiel in C #, wo Funktionen eigentlich keine erstklassigen Objekte sind. Der obige Code verwendet daher eine kleine Problemumgehung (nämlich einen generischen Delegaten, der aufgerufen wird Action<>), um eine Funktion als Argument zu übergeben. In anderen Sprachen wie Ruby können sogar Klassen und Codeblöcke als normale Variablen behandelt werden (oder im Fall von Ruby Konstanten).

Konrad Rudolph
quelle
17

Aus einer Folie in Struktur und Interpretation von Computerprogrammen , Vorlesung 2A (1986), in der wiederum Christopher Stracey zitiert wird :

Die Rechte und Privilegien erstklassiger Bürger:

  • Von Variablen zu benennen.
  • Als Argumente an Prozeduren zu übergeben.
  • Als Werte von Prozeduren zurückzugeben.
  • In Datenstrukturen zu integrieren
Federico A. Ramponi
quelle
1

IMO ist dies eine dieser Metaphern, mit denen Dinge in einer natürlichen Sprache beschrieben werden. Der Begriff wird im Wesentlichen im Zusammenhang mit der Beschreibung von Funktionen als erstklassige Objekte verwendet.

Wenn Sie eine objektorientierte Sprache in Betracht ziehen, können wir Objekten verschiedene Funktionen zuweisen, z. B. Vererbung, Klassendefinition, Fähigkeit zur Übergabe an andere Codeabschnitte (Methodenargumente), Fähigkeit zur Speicherung in einer Datenstruktur usw. Wenn wir dies tun können Ähnlich wie bei einer Entität, die normalerweise nicht als Objekt betrachtet wird, wie Funktionen im Fall von Java-Skripten, werden solche Entitäten als erstklassige Objekte betrachtet.

Erste Klasse bedeutet hier im Wesentlichen, nicht als zweite Klasse behandelt zu werden (mit verschlechtertem Verhalten). Im Wesentlichen ist die Verspottung perfekt oder nicht zu unterscheiden.

questzen
quelle