Ich weiß, dass Python eine len()
Funktion hat, mit der die Größe eines Strings bestimmt wird, aber ich habe mich gefragt, warum es keine Methode des String-Objekts ist.
Aktualisieren
Ok, mir wurde klar, dass ich mich peinlich geirrt hatte. __len__()
ist eigentlich eine Methode eines String-Objekts. Es scheint nur seltsam, objektorientierten Code in Python zu sehen, der die len-Funktion für Zeichenfolgenobjekte verwendet. Darüber hinaus ist es auch seltsam, __len__
den Namen statt nur len zu sehen.
len
ist. Sie denken, dass es einfacher ist, Menschen zur Umsetzung.__len__
zu zwingen , als Menschen zur Umsetzung zu zwingen.len()
. Es ist das gleiche und man sieht viel sauberer aus. Wenn die Sprache eine OOP haben wird__len__
, was in aller Welt ist der Sinn derlen(..)
__iter__
oder nur mit erstellen__getitem__
unditer(x)
funktionieren in beide Richtungen. Sie können mit__bool__
oder ein im Bool-Kontext verwendbares Objekt erstellen__len__
,bool(x)
das in beiden Fällen funktioniert. Und so weiter. Ich denke , Armin dies recht gut in der verknüpften Post aber erklärt , auch wenn er nicht, rief Python moronic wegen einer außerhalben Erklärung von einem Mann, der mit dem Kern Devs uneins oft öffentlich ist nicht gerade fair sein ...zip
ist eine Funktion der obersten Ebene, keinezip_with
Methode. Und so weiter. Nur weil alles ein Objekt ist, heißt das nicht, dass es das Wichtigste an jeder Sache ist, ein Objekt zu sein.Jims Antwort auf diese Frage könnte helfen; Ich kopiere es hier. Zitat von Guido van Rossum:
quelle
Es gibt eine
len
Methode:quelle
Python ist eine pragmatische Programmiersprache, und die Gründe für
len()
eine Funktion ist , und kein Verfahrenstr
,list
,dict
usw. sind pragmatisch.Die
len()
integrierte Funktion befasst sich direkt mit integrierten Typen: Die CPython-Implementierung von gibtlen()
tatsächlich den Wert desob_size
Felds in derPyVarObject
C-Struktur zurück , das jedes integrierte Objekt mit variabler Größe im Speicher darstellt. Dies ist viel schneller als das Aufrufen einer Methode - es muss keine Attributsuche durchgeführt werden. Immer die Anzahl der Elemente in einer Sammlung ist ein gemeinsamer Betrieb und müssen effizient für eine solche grundlegende und vielfältige Arten wie arbeitenstr
,list
,array.array
usw.Um die Konsistenz zu fördern
len(o)
, wird Python bei der Anwendung auf einen benutzerdefinierten Typo.__len__()
als Fallback aufgerufen.__len__
,__abs__
Dokumentiert und alle anderen speziellen Methoden in der Python - Datenmodell machen es einfach , Objekte, die sich verhalten wie die Einbauten zu schaffen, so dass die ausdrucksstark und sehr konsistent APIs wir „Pythonic“ nennen.Durch die Implementierung spezieller Methoden können Ihre Objekte Iteration unterstützen, Infix-Operatoren überladen, Kontexte in
with
Blöcken verwalten usw. Sie können sich das Datenmodell als eine Möglichkeit vorstellen, die Python-Sprache selbst als Framework zu verwenden, in das die von Ihnen erstellten Objekte nahtlos integriert werden können.Ein zweiter Grund, der durch Zitate von Guido van Rossum wie diesem gestützt wird , ist, dass es einfacher zu lesen und zu schreiben ist
len(s)
alss.len()
.Die Notation
len(s)
stimmt mit unären Operatoren mit Präfixnotation überein, wie zabs(n)
.len()
wird viel häufiger verwendet alsabs()
, und es verdient, so einfach zu schreiben zu sein.Es kann auch einen historischen Grund geben: In der ABC-Sprache, die Python vorausging (und deren Design sehr einflussreich war), gab es einen unären Operator, der so geschrieben wurde, wie es
#s
bedeutetelen(s)
.quelle
quelle
Hier gibt es einige großartige Antworten, und bevor ich meine eigenen gebe, möchte ich einige der Edelsteine hervorheben (kein Rubinwortspiel beabsichtigt), die ich hier gelesen habe.
len
ist also eigentlich ein Objekt. Ruby hingegen hat keine erstklassigen Funktionen. Daslen
Funktionsobjekt verfügt also über eigene Methoden, die Sie durch Ausführen überprüfen könnendir(len)
.Wenn Ihnen die Funktionsweise in Ihrem eigenen Code nicht gefällt, ist es für Sie trivial, die Container mit Ihrer bevorzugten Methode erneut zu implementieren (siehe Beispiel unten).
quelle
Du kannst auch sagen
Verwenden von Python 2.7.3.
quelle
len
Funktion wurde bereits in früheren Antworten erwähnt. Was ist dann der Sinn dieser "Antwort"?In den restlichen Antworten fehlt hier etwas: Die
len
Funktion prüft, ob die__len__
Methode ein nicht negatives Ergebnis zurückgibtint
. Die Tatsache, dasslen
es sich um eine Funktion handelt, bedeutet, dass Klassen dieses Verhalten nicht überschreiben können, um die Überprüfung zu vermeiden. Als solcheslen(obj)
gibt es ein Sicherheitsniveau,obj.len()
das nicht möglich ist.Beispiel:
Natürlich ist es möglich, die
len
Funktion durch erneutes Zuweisen als globale Variable zu "überschreiben" , aber Code, der dies tut, ist viel offensichtlicher verdächtig als Code, der eine Methode in einer Klasse überschreibt.quelle
Es nicht?
quelle