`Final` Keyword-Äquivalent für Variablen in Python?

Ich konnte keine Dokumentation über ein Äquivalent von Java's final in Python finden, gibt es so etwas?

Ich schaffe einen Schnappschuss eines Objekts (für die Wiederherstellung verwendet, wenn etwas fehlschlägt); Sobald diese Sicherungsvariable zugeordnet ist, sollte sie nicht geändert werden – eine endgültige Funktion in Python wäre nett dafür.

8 Solutions collect form web for “`Final` Keyword-Äquivalent für Variablen in Python?”

Wenn Sie eine Variable in Java final möchten, bedeutet dies grundsätzlich, dass Sie, wenn Sie einer Variablen zuordnen, diese Variable nicht zu einem anderen Objekt verweisen können. Es bedeutet eigentlich nicht, dass das Objekt nicht verändert werden kann. Zum Beispiel funktioniert der folgende Java-Code einwandfrei:

 public final List<String> messages = new LinkedList<String>(); public void addMessage() { messages.add("Hello World!"); // this mutates the messages list } 

Aber das folgende würde nicht einmal kompilieren:

 public final List<String> messages = new LinkedList<String>(); public void changeMessages() { messages = new ArrayList<String>(); // can't change a final variable } 

Also deine Frage ist, ob das final in Python existiert. Es tut nicht.

Python hat jedoch unveränderliche Datenstrukturen. Zum Beispiel, während du eine list mutieren kannst, kannst du kein tuple mutieren. Sie können einen set mutieren set aber kein frozenset , etc.

Mein Rat wäre, sich einfach nicht darum zu kümmern, die Nicht-Mutation auf dem Sprachniveau zu erzwingen und einfach darauf zu achten, dass du keinen Code schreibst, der diese Objekte mutiert, nachdem sie zugewiesen wurden.

In Python gibt es kein “ endgültiges 'Äquivalent.

Um jedoch schreibgeschützte Felder von Klasseninstanzen zu erstellen, können Sie die Eigenschaftsfunktion verwenden.

Bearbeiten : vielleicht möchtest du so etwas wie dieses:

 class WriteOnceReadWhenever: def __setattr__(self, attr, value): if hasattr(self, attr): raise Exception("Attempting to alter read-only value") self.__dict__[attr] = value 

Eine Zuordnung-einmal-Variable ist ein Design-Problem. Sie entwerfen Ihre Anwendung so, dass die Variable einmal und einmal gesetzt wird.

Allerdings, wenn Sie Laufzeit-Überprüfung Ihres Designs wollen, können Sie es mit einem Wrapper um das Objekt zu tun.

 class OnePingOnlyPleaseVassily( object ): def __init__( self ): self.value= None def set( self, value ): if self.value is not None: raise Exception( "Already set.") self.value= value someStateMemo= OnePingOnlyPleaseVassily() someStateMemo.set( aValue ) # works someStateMemo.set( aValue ) # fails 

Das ist klobig, aber es wird Design-Probleme zur Laufzeit erkennen.

Es gibt keine solche Sache. Im Allgemeinen ist die Python-Haltung "wenn Sie nicht wollen, dass diese modifiziert, nur nicht ändern". Kunden einer API sind unwahrscheinlich, nur um Ihre undokumentierten Internisten sowieso zu stoßen.

Sie könnten, ich vermute, um diese herum arbeiten, indem ich Tupel oder benannte Tische für die relevanten Bits Ihres Modells verwende, die inhärent unveränderlich sind. Das hilft immer noch nicht mit irgendeinem Teil Ihres Modells, das natürlich veränderlich sein muss.

Python hat kein Äquivalent von "final". Es hat weder "öffentlich" noch "geschützt", außer durch Namenskonvention. Es ist nicht das "Bondage und Disziplin".

Sie können so etwas durch das Deskriptor-Protokoll simulieren, da es erlaubt, das Lesen zu definieren und eine Variable so einzustellen, wie Sie es wünschen.

 class Foo(object): @property def myvar(self): # return value here @myvar.setter def myvar(self, newvalue): # do nothing if some condition is met a = Foo() print a.myvar a.myvar = 5 # does nothing if you don't want to 

http://code.activestate.com/recipes/576527/ definiert eine Einfrierfunktion, obwohl es nicht perfekt funktioniert.

Ich würde es nur betrachten.

Obwohl dies eine alte Frage ist, dachte ich, ich würde noch eine weitere potenzielle Option hinzufügen: Sie können auch assert , um zu überprüfen, ob eine Variable auf das eingestellt ist, was Sie ursprünglich beabsichtigt haben, dass sie eingestellt werden – eine doppelte Überprüfung, wenn Sie werden. Obwohl dies nicht das gleiche wie final in Java ist, kann es verwendet werden, um einen ähnlichen Effekt zu erstellen:

 PI = 3.14 radius = 3 try: assert PI == 3.14 print PI * radius**2 except AssertionError: print "Yikes." 

Wie oben gesehen, wenn PI aus irgendeinem Grund nicht auf 3.14 , würde ein AssertionError geworfen werden, also ein try/except Block wäre wahrscheinlich ein kluger Zusatz. Unabhängig davon kann es je nach Ihrer Situation nützlich sein.

  • Warum sind nicht "und" und "oder" Betreiber in Python?
  • Wie kann ich die ursprüngliche Reihenfolge der Schlüsselwort-Argumente abrufen, die an einen Funktionsaufruf übergeben werden?
  • So fügen Sie Meta-Keyword mit Django hinzu
  • Python ist die beste Programmiersprache der Welt.