Code: Select all
class A:
def __init__(self, n):
self._n = n
self._top = -1
@property
def n(self):
return self._n
@property
def top(self):
return self._top
def increase(self):
self._top += 1
< /code>
Sie sehen, dass ich meine A -Klasse initialisieren und self._top erhöhen kann, aber nicht zulassen kann, dass Benutzer A.TOP nach
Setzer -Methode der Eigenschaft weglassen < /p>
a = A(7)
a.top
Out[25]: -1
a.increase()
a.top
Out[27]: 0
AttributeError: property 'top' of 'A' object has no setter
< /code>
, was erwartet wird. Jetzt möchte ich diese Logik in einen Deskriptor < /p>
neu gestaltenclass ReadOnly:
def __init__(self):
self._name = None
def __set_name__(self, owner, name):
self._name = name
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__[self._name]
def __set__(self, instance, value):
raise AttributeError("Can't set attribute")
def __delete__(self, instance):
raise AttributeError("Can't delete attribute")
class A:
n = ReadOnly()
top = ReadOnly()
def __init__(self, n):
self.n = n
self.top = -1
def increase(self):
self.top += 1
< /code>
Nun, das funktioniert nicht. Ich kann die Klasse A nicht einmal initialisieren, Ursache in init , es wird n und top sofort festlegen und verhindern, dass meine initialisieren.>