Dynamische schreibgeschützte Attribute in Python-Instanzen
Posted: 17 Mar 2025, 14:44
Bearbeiten Dieser Code enthält mehrere Fehler. Weitere Informationen finden Sie in der Antwort von JSBueno für eine korrekte Version
Ich möchte schreibgeschützte Attribute erstellen, die Werte dynamisch aus einem internen Wörterbuch abrufen. Ich habe versucht, diese als Deskriptoren zu implementieren: < /p>
Wenn ich die Registerkarte für automatische Vervollständigung auf A1 drücke. Ich habe auch versucht, über die __Getattr __ Methode der Instanz zu implementieren:
Wenn ich B = B (['W'], [3]) In einer interaktiven Sitzung auf b. Bei einer interaktiven Sitzung werden beim Drücken der Registerkarte angegeben. Ich habe versucht, in den Pandas -Code zu schauen, aber es ist ein bisschen abstrus für mich. Ich denke, sie verwenden etwas Ähnliches wie meine zweite Option __getAttr __ , aber ich verstehe nicht, wie sie es funktionieren.>
Ich möchte schreibgeschützte Attribute erstellen, die Werte dynamisch aus einem internen Wörterbuch abrufen. Ich habe versucht, diese als Deskriptoren zu implementieren: < /p>
Code: Select all
from typing import Any
class AttDesc:
def __init__(self, name):
self.name = name
def __get__(self, obj, objtype=None):
return obj._d[self.name]
def __set__(self, obj, value):
raise AtrributeError("Read only!")
class A:
def __init__(self, klist: list[str], vlist: list[Any]) -> None:
self._d = dict(zip(klist, vlist))
for k in self._d:
setattr(type(self), k, AttDesc(k))
@property
def d(self):
return self._d
< /code>
Das [url=viewtopic.php?t=15738]Problem[/url] mit diesem Ansatz ist, dass die Deskriptorinstanzen Klassenattribute sind. Dies bedeutet, dass in einer interaktiven Sitzung: < /p>
a1 = A(['x', 'y'], [1, 2])
a2 = A(['z', ], [3])
Code: Select all
class B:
def __init__(self, klist: list[str], vlist: list[Any]):
object.__setattr__(self, '_d', dict(zip(klist, vlist)))
@property
def d(self):
return self._d
def __getattr__(self, name):
if name in self.d:
return self.d[name]
else:
object.__getattr__(name)
def __setattr__(self, k, v):
if k in self.d:
raise AttributeError("Read only!")
object.__setattr__(self, k, v)