Ich habe zwei Klassen A
und B
, wobei B
von A
erbt und eine Eigenschaft überschreibt. A
ist nicht unter meiner Kontrolle, also kann ich es nicht ändern.Unterscheidung zwischen Anrufern innerhalb und außerhalb der Klassenhierarchie
Der Code sieht wie folgt aus:
class A():
def __init__(self, value):
self.value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
self._value = value
class B(A):
def __init__(self, value):
super(B, self).__init__(value)
@property
def value(self):
return super(B, self).value
@value.setter
def value(self, value):
raise AttributeError("can't set attribute")
Wenn ich versuche, B(1)
ich anrufen offensichtlich AttributeError: can't set attribute
zu bekommen.
Ich mag ein anderes Verhalten haben, wenn value
von innen Klassenmethoden gesetzt
@value.setter
def value(self, value):
if set from inside class hierarchy:
pass
else:
raise AttributeError("can't set attribute")
Das Modul inspect
scheint nicht mir genügend Informationen zu geben, dies zu tun, außer Kontrolle gegen eine Liste von bekannten Funktionen .
Kannst du nicht einfach eingestellt 'self._value' statt' self.value'? Eigenschaften existieren als API für die Außenwelt, nicht unbedingt für das Objekt selbst. – acdr
Sie könnten den Stack-Trace untersuchen, um herauszufinden, wer der Anrufer ist. – Norman
@acdr, leider 'A' ist nicht unter meiner Kontrolle, so kann ich nicht ändern, wie es sich verhält. Ich habe die Frage bearbeitet, um das zu reflektieren. – Dumitru