Python -Deskriptoren zu Readonly -AttributenPython

Python-Programme
Anonymous
 Python -Deskriptoren zu Readonly -Attributen

Post by Anonymous »

Ich möchte einen großen Teil meines Codes in einen generischen Deskriptor umrüsten, um nur den Zugriff auf den Attribut zu lesen. Das Folgende ist ein Beispiel für die Eigentumsbasis -Implementierung < /p>

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
Sie sehen, dass ich meine A -Klasse initialisieren und self._top initialisieren kann, aber nicht zulassen, dass der Benutzer A.Top durch
Eigenschaft Setzer -Methode
einstellen lässt

Code: Select all

a = A(7)
a.top
Out[25]: -1
a.increase()
a.top
Out[27]: 0
Wenn ich a.top = 4 mache, gibt es mir einen Fehler

Code: Select all

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, verursachen in __init __ es wird sofort n und Top sofortig festgelegt und verhindern, dass mein Logik aus dem Eigentum in die Initialisierung initialisiert wird. Das suche ich. Ich habe es zum Laufen gebracht. Eine letzte Sache, wenn ich ein Attribut habe, ist eine Liste, sagen Sie < /p>

Code: Select all

class Stack:
S = ReadOnly()
n = ReadOnly()
top = ReadOnly()

def __init__(self, n):
self._S = [None] * n
self._n = n
self._top = -1  # python offset 1
< /code>
Jetzt kann ich Self.top nicht mehr ändern < /p>
>>> s = Stack(4)
>>> s.S
[None, None, None, None]
< /code>
Noch kann ich S < /p>
ändern>>> s.S = [1, 3]  # not allowed anymore. Great!
But I can still change an element in the list
>>> s.S[3] = 3
[None, None, None, 3]
Wie kann ich Listenelementänderungen verhindern?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post