Wenn "explizit ist besser als implizit", warum gibt es in Python keine expliziten Zugriffsmodifikatoren: öffentlich, geschützt, privat usw.?
Ich weiß, dass die Idee ist, dass der Programmierer durch einen Hinweis wissen sollte, was zu tun ist - keine Notwendigkeit, "rohe Gewalt" anzuwenden. Aber IMO 'Encapsulation' oder 'Information Hiding' soll nicht nur Menschen fernhalten, sondern ist auch eine Frage der Organisation und Struktur: Ihre Entwicklungsebenen sollten selbstdefinierende, klar abgegrenzte Bereiche und Grenzen haben, genau wie physische Systeme.
Kann mir hier bitte jemand mit einer soliden Erklärung helfen, warum Zugriffsbeschränkungen in Python, einer Sprache, die ansonsten nahezu perfekt zu sein scheint, eher impliziert als explizit sind?
Bearbeiten: Bisher habe ich 3 vorgeschlagene Antworten gesehen und festgestellt, dass meine Frage aus 2 Teilen besteht:
Warum gibt es zum Beispiel keine Schlüsselwörter?
private def myFunc(): dostuff....
statt IMO die hässlichen und schwer zu tippenden Unterstriche. Aber das ist nicht der wichtige Punkt.
Wichtiger:
Warum werden diese Zugriffsmodifikatoren nur "Empfehlungen" oder Hinweise und nicht erzwungen. Es wird schwer sein, später zu ändern? Es ist sehr einfach, "geschützt" in "öffentlich" zu ändern - und wenn Sie eine komplizierte Vererbungskette haben, die es schwierig macht, haben Sie ein schlechtes Design - Ihr Design sollte verfeinert werden, anstatt sich auf eine Sprachfunktion zu verlassen, die das Schreiben erleichtert schlecht strukturierter Code.
Wenn Zugriffsmodifikatoren erzwungen werden, wird Ihr Code automatisch unterteilt. Sie wissen, dass bestimmte Segmente außerhalb des Gültigkeitsbereichs liegen, sodass Sie sich nur dann mit ihnen befassen müssen, wenn dies erforderlich ist. Und wenn Ihr Design nicht gut ist und Sie ständig Dinge in verschiedene Bereiche verschieben oder aus diesen entfernen, kann Ihnen die Sprache dabei helfen, Ihren Akt zu bereinigen.
So sehr ich Python liebe, finde ich, dass dieser zweite Punkt ein schwerwiegender Mangel ist. Und ich habe noch keine gute Antwort darauf.
private def whatever
ist, dass dies class x: def whatever(self): pass
eine Abkürzung ist class x: pass; x.whatever = lambda self: pass
, weshalb Sie im Grunde genommen einen privaten Modifikator für die Zuweisung benötigen würden