Die Art, wie Sie es beschreiben, ist absolut nicht möglich. Die Zuweisung zu einem Namen ist ein grundlegendes Merkmal von Python und es wurden keine Hooks bereitgestellt, um das Verhalten zu ändern.
Die Zuordnung zu einem Mitglied in einer Klasseninstanz kann jedoch so gesteuert werden, wie Sie möchten, indem Sie .__setattr__()
überschreiben.
class MyClass(object):
def __init__(self, x):
self.x = x
self._locked = True
def __setattr__(self, name, value):
if self.__dict__.get("_locked") and name == "x":
raise AttributeError("MyClass does not allow assignment to .x member")
self.__dict__[name] = value
>>> m = MyClass(3)
>>> m.x
3
>>> m.x = 4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in __setattr__
AttributeError: MyClass does not allow assignment to .x member
Hinweis, dass es einen Elementvariable, _locked
, die steuert, ob die Zuordnung erlaubt ist. Sie können es entsperren, um den Wert zu aktualisieren.
Was ist der Anwendungsfall? – msw
Anwendungsfall: Leute werden kleine Skripts mit meiner Service-API schreiben, und ich möchte verhindern, dass sie interne Daten ändern und diese Änderung auf das nächste Skript übertragen. – Caruccio
Python vermeidet ausdrücklich, dass ein böswilliger oder ignoranter Coder vom Zugriff ausgeschlossen wird. Andere Sprachen erlauben es, Programmierfehler aufgrund von Ignoranz zu vermeiden, aber die Leute haben eine unheimliche Fähigkeit, um sie herum zu programmieren. – msw