2016-05-02 11 views
-1

In Python kann man special methods verwenden, um etwas Ähnliches wie Operatorüberladung in C++ zu erreichen, indem man eine spezielle Methode für __setattr__ definiert. Ich habe gesehen, dass einige Programmierer dies verwenden, um eine schreibgeschützte Sperre unter Verwendung eines verfälschten Variablennamens zu erstellen. Das ist ziemlich schlau, bis ich ein Element zu einem Array der gesperrten Klasse brauche. Zum Beispiel FreeIPA implements this. Dies wäre ziemlich einfach sein, indem einfach zu besiegen Einstellung exampleArray._ReadOnly__locked = False, außer diesem auch durch die __setattr__ spezielle Methode und Ergebnisse in dem FehlerPython: Wie kann ich eine Sperre in mangled Variable, die eine spezielle Methode verwendet, besiegen?

"ipa: ERROR: AttributeError: locked: cannot set NameSpace._ReadOnly__locked to False"

Gibt es einen einfachen und cleveren Weg, um diese zurück zu setzen gefangen wird Lese-Schreib-Modus, so dass ich meinen Wert in das Array einfügen kann?

+1

Haben Sie daran gedacht, dass es einen guten Grund gibt, warum die Autoren von FreeIPA so viel unternommen haben, um das zu erreichen, was Sie tun wollen? – holdenweb

+0

Ja. Aber es gibt auch einen guten Grund, warum ich es besiegen will. Das Projekt bietet auch eine [plugin/extension architecture] (https://abbra.fedorapeople.org/freeipa-extensibility.html) und wenn Sie, sagen wir, Kommentare zu Ihrem [DNS] (http: //www.freeipa .org/page/DNS) Einträge laufen Sie sehr schnell in die schreibgeschützte Sperre. –

+2

Der 'ReadOnly'-Docstring zeigt * Ihnen * an, wie Sie den Schutz umgehen können. – user2357112

Antwort

2

Wie im Docstring angegeben, können Sie die Standardimplementierung __setattr__ von object verwenden.

class ReadOnly(object): 
    def __setattr__(self, name, value): 
     raise AttributeError("This instance is read only.") 

r = ReadOnly() 
object.__setattr__(r, 'name', 'value') 
print r.name # 'value' 

Das potenzielle Problem hier ist, wenn Ihre Eltern-Klasse etwas Besonderes tut, wenn Objekte festlegen. In diesem Fall ist die resultierende Instanz möglicherweise inkonsistent.