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)