Warum funktioniert die Python-code, verwenden Sie den len () - Funktion anstelle der length-Methode?
Ich weiß, dass python hat eine len()
Funktion, die verwendet wird, um zu bestimmen, die Größe einer Zeichenfolge, aber ich Frage mich, warum es nicht eine Methode des string-Objekts.
Update
Ok, ich merkte, ich war Irre peinlich. __len__()
ist eigentlich eine Methode, die ein string-Objekt. Es scheint gerade seltsam zu sehen, objektorientierter code in Python unter Verwendung der len-Funktion auf string-Objekte. Außerdem ist es seltsam zu sehen __len__
wie der name anstatt nur len.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Saiten haben eine length-Methode:
__len__()
Des Protokolls in Python zu implementieren Sie diese Methode auf Objekte, die eine Länge und verwenden Sie die integrierte
len()
- Funktion, die Anrufe für Sie, ähnlich wie die Weise, die Sie umsetzen würden__iter__()
und verwenden Sie die integrierte initer()
- Funktion (oder über die Methode " hinter den kulissen für Sie) auf Objekte sind iterierbar.Sehen Die Emulation container-Typen für weitere Informationen.
Hier ist gut zu Lesen, auf das Thema Protokolle in Python: Python und das Prinzip der Geringsten Verwunderung
len
ist. Sie denken, dass es einfacher ist, Menschen zu zwingen, implementieren.__len__
als die Menschen zwingen, zu implementieren.len()
. Es ist die gleiche Sache, und man sieht viel cleaner. Wenn die Sprache auf eine OOP__len__
, was in der Welt ist der Punkt, anlen(..)
__iter__
oder mit nur__getitem__
, unditer(x)
wird so oder so funktionieren. Sie können eine verwendbare-in-bool-Kontext-Objekt mit__bool__
oder__len__
, undbool(x)
wird so oder so funktionieren. Und so weiter. Ich denke, Armin erklärt das ganz gut in den verlinkten Beitrag—aber selbst wenn er nicht, ruft Python schwachsinnig, weil von einem außen Erklärung von einem Mann, der Häufig öffentlich im Widerspruch zu den core-devs wäre nicht gerade fair...zip
ist eine top-level Funktion, nicht einezip_with
Methode. Und so weiter. Nur weil alles ein Objekt ist, bedeutet nicht, ein Objekt handelt, ist die wichtigste Sache, über jedes Ding.len("__len__") is not "len".__len__()
... :/len("__len__") == "__len__".__len__()
, undlen("len") == "len".__len__()
.Jim ' s Antwort auf diese Frage kann helfen; ich kopiere es hier. Zitieren Guido van Rossum:
Es ist ein
len
Methode:Python ist pragmatisch-Programmiersprache, und die Gründe für
len()
ist eine Funktion und keine Methode derstr
,list
,dict
etc. sind pragmatisch.Den
len()
eingebaute Funktion, sich direkt mit built-in-Typen: die CPython-Implementierung vonlen()
tatsächlich liefert den Wert derob_size
Feld in derPyVarObject
struct C, dass steht für eine beliebige variable-sized-built-in-Objekt im Speicher. Dies ist viel schneller als der Aufruf einer Methode-keine Attribut-lookup gemacht werden muss. Immer die Anzahl der Elemente in einer Auflistung ist ein allgemeiner Vorgang und muss effizient arbeiten, die für solche grundlegenden und vielfältigen Arten, wiestr
,list
,array.array
etc.Jedoch zur Förderung der Kohärenz bei der Anwendung
len(o)
um einen benutzerdefinierten Typ, Python rufto.__len__()
als fallback.__len__
,__abs__
und alle anderen speziellen Methoden dokumentiert, die in der Python Daten Modell machen es einfach, um Objekte zu erstellen, die sich Verhalten wie die built-ins, ermöglichen die ausdrucksstark und sehr konsistente APIs nennen wir "Pythonic".Durch die Implementierung von speziellen Methoden Ihrer Objekte unterstützen kann, iteration, überlast-infix-Operatoren, verwalten Kontexte, in
with
blocks usw. Sie können sich die Daten-Modell als ein Weg, mit der Sprache Python als Rahmen, in dem die Objekte, die Sie erstellen können nahtlos integriert werden.Einen zweiten Grund, unterstützt durch Zitate von Guido van Rossum wie diese eine, ist, dass es einfacher ist zu Lesen und zu schreiben
len(s)
alss.len()
.Die notation
len(s)
ist konsistent mit unären Operatoren mit Präfix-notation, wieabs(n)
.len()
verwendet wird, weit mehr, als oftabs()
, und Sie verdient es so einfach zu schreiben.Kann es auch einen historischen Grund: in der ABC-Sprache, die vorausgegangen Python (und war sehr einflussreich in seinem design), es war ein unärer operator geschrieben werden als
#s
was bedeutetelen(s)
.Gibt es einige tolle Antworten hier, und so bevor ich meine eigenen möchte ich hervorheben ein paar der Edelsteine (keine ruby Wortspiel beabsichtigt), die ich hier gelesen hab.
len
ist tatsächlich ein Objekt. Ruby, auf der anderen Seite, keine erste-Klasse-Funktionen. Also dielen
Funktion Objekt hat seine eigenen Methoden, mit denen Sie überprüfen können, durch ausführendir(len)
.Wenn Sie nicht wie die Art und Weise dies funktioniert in Ihrem eigenen code, es ist trivial für Sie zu re-implementieren Sie die Behälter mit Ihrem bevorzugten Methode (siehe Beispiel unten).
Können Sie auch sagen
Mit Python 2.7.3.
len
Funktion wurde bereits in vorigen Antworten. Was ist der Punkt, der diese "Antwort", dann?Nicht?