Nach Python 2.7.12 Dokumentation:Wieso favorisieren Sie das Objekt .__ setattr __ (self, name, value) nur in neuen Stilklassen?
Wenn
__setattr__()
auf eine Instanz Attribut zuweisen will, sollte es nicht einfachself.name = value
ausführen - dies eine rekursive Verbindung zu sich selbst führen würde. Stattdessen sollte es den Wert in das Verzeichnis von Instanzattributen einfügen, z. B.self.__dict__[name] = value
. Für neuen Stil Klassen, anstatt die Instanz Wörterbuch zugreifen, es sollten die Basisklasse Methode mit dem gleichen Namen nennen, beispielsweiseobject.__setattr__(self, name, value)
.
jedoch der folgende Code funktioniert wie man erwarten würde:
class Class(object):
def __setattr__(self, name, val):
self.__dict__[name] = val;
c = Class()
c.val = 42
print c.val
Ich weiß super(Class, obj).__setattr__(name, value)
die __setattr__
Methoden aller Basisklassen sicherzustellen, genannt zu werden, aber klassische Klasse kann auch von Basen Klassen erben. Warum wird es nur für neue Stilklassen empfohlen?
Oder auf der anderen Seite, warum ist dies nicht für klassische Klassen empfohlen?
* Warum wird es nur für neue Stilklassen empfohlen? * Wenn man '__setattr__' aufruft, anstatt direkt im Instanzwörterbuch zu arbeiten, kann die Superklasse" überwachen ", was passiert. Stellen Sie sich diesen Ansatz als einen Vorteil neuer Stilklassen vor.Es wird wahrscheinlich für alle Klassen empfohlen, aber Klassen im alten Stil, die nicht erben, haben keine Superklasse mit einer aufrufbaren Methode "__setattr__". – jedwards
@jedwards Yeah, da es für klassische Klassen kein 'classobj .__ setattr__' gibt, für neue style Klassen nur' object .__ setattr__'. –
Sie sind genau richtig. Mein Punkt war, dass ich den fettgedruckten Satz sah, nicht so sehr wie die Entmutigung, das Instanz-Diktat direkt zu verwenden (wie Sie gezeigt haben, funktioniert es in vielen Fällen völlig einwandfrei, und wie Martijn gezeigt hat, gibt es Fälle, in denen dies nicht der Fall ist)), sondern eher eine Ermutigung *, um '__setattr__' zu verwenden, was der Oberklasse eine gewisse Übersicht und die Verwendung neuerer Merkmale wie Deskriptoren ermöglicht. Sorry, wenn ich unklar war :) – jedwards