den folgenden Code zu haben:Python Ignorieren Eltern __setattr__
class Parent():
def __init__(self):
pass
def __setattr__(self, name, value):
raise RuntimeError()
class Child(Parent):
def __init__(self):
super().__init__()
self.y = 2
if __name__ == '__main__':
print(Child().y)
und die folgenden Bedingungen/Annahmen:
- Klasse
Parent
hat etwas in seiner__setattr__
Implementierung, dieChild
hebt eine Ausnahme macht, wenn neue Einstellung Klassenattribute. - Klasse
Parent
Quellcode kann nicht geändert werden (könnte Affe-Patched sein, aber es ist eine externe Abhängigkeit).
Gibt es eine Möglichkeit, das zu beheben? Könnte ich die Parent
Implementierung __setattr__
vor der Einstellung y
"Müll"? Kann ich diese Methode in Child
erneut implementieren, damit es wie erwartet funktioniert?
object.__setattr__(self, 'y', 2)
Beachten Sie, dass diese vollständig umgeht Parent
‚s __setattr__
, so dass dies tun könnten verschiedene Invarianten in Parent
brechen:
Sie überlasten '__setattr__' in der' Child' Klasse. –
@hiroprotagonist: Ja, ich habe versucht mit 'object .__ setattr__', das hat nicht funktioniert, und das ist, wenn ich die Frage gestellt habe. Jetzt kenne ich den Unterschied zwischen 'super' und 'super (Eltern, selbst) .__ setattr__'. :-) – Peque
ich meinte eigentlich was ich als antwort unten gepostet habe; Rufen Sie nicht '__setattr__' auf' Objekt' auf, sondern nur auf 'self'. dies umgeht alle "__setatrs__", die in der MRO-Kette definiert worden sein könnten. –