2017-06-08 8 views
0

Wenn ich __getstate__() und __setstate__() in einer Elternklasse definiere, wäre ein Kind in der Lage, diese Methoden zu erben? Es gibt einige verwandte Diskussionen in this SO answer, aber nur bei Methoden mit einem vorhergehenden Doppel-Unterstrich (Dunder).Sind Dunder-Methoden geerbt?

einige zusätzliche Informationen:

  • ich diese Serialisierung (Beizen) Verhalten meiner Klassen zu tun zu definieren.
  • Python 2,7
+0

@ MSeifert class-private Namen (d. H. '__ *') werden neu geschrieben, um ein beschädigtes Formular zu verwenden, um Namenskonflikte zwischen "privaten" Attributen von Basis- und abgeleiteten Klassen zu vermeiden. Ich bin mir nicht sicher, ob Dunder-Dunder-Methoden in dieses Boot fallen. – BoltzmannBrain

+1

Nein, das tun sie nicht - weil sie nicht als "private attributes" (diese sind definiert als "mindestens zwei führende Unterstriche, höchstens ein abschließender Unterstrich") definiert sind: siehe https://docs.python.org/2 /tutorial/classes.html#private-variables-and-class-local-references – MSeifert

Antwort

5

Ja, Dunder Methoden ganz gut geerbt. Aus der Antwort gibt, verknüpft die Dokumentation ist Reserved classes of identifiers:

__*__
Vom System definierte Namen. Diese Namen werden vom Interpreter und seiner Implementierung (einschließlich der Standardbibliothek) definiert. Aktuelle Systemnamen werden im Abschnitt Spezielle Methodennamen und an anderer Stelle erläutert. Mehr wird wahrscheinlich in zukünftigen Versionen von Python definiert werden. Beliebig Verwendung von __*__ Namen, in jedem Zusammenhang, die nicht explizit dokumentierte Verwendung folgt, ist Bruch ohne Warnung.

die eine separate Klasse ist von __*privaten Klassen Namen.

und die anderen verknüpften Abschnitt ist Identifiers (Names) die vielleicht deutlicher noch:

Wenn eine Kennung, die in einer Klassendefinition erfolgt textuell mit zwei oder mehr Streichungszeichen beginnt und endet nicht in zwei oder mehr Unterstrichen, wird es als privater Name dieser Klasse betrachtet.

Fett Hervorhebung meins; Namen, die mit zwei Unterstrichen beginnen und mit zwei Unterstrichen enden, sind nicht class-private Namen.

Beachten Sie, dass beide Klassen von Namen vererbt werden (Vererbung funktioniert durch Nachschlagen von Attributnamen in der MRO der Klasse). Dass die Namen verstümmelt sind, verhindert nicht, dass sie vererbt werden, was ist, warum die Namen an erster Stelle verstümmelt werden. Durch Voranstellen solcher Namen mit _ClassName Unterklassen können Sie den Namen erneut verwenden und nicht automatisch kollidieren, da diese ihr eigenes _SubClass Präfix erhalten.

+0

Oh, das habe ich in der Dokumentation verpasst! Danke :) – BoltzmannBrain

+1

@BoltzmannBrain: und beide Klassen von Namen werden gut vererbt; der Name ist * mangled *, nicht versteckt. –