親クラスに__getstate__()
と__setstate__()
を定義すると、子はこれらのメソッドを継承できますか? this SO answerにいくつかの関連する議論がありますが、先行する二重アンダースコア(dunder)を持つメソッドについてのみです。dunderメソッドは継承されていますか?
いくつかの余分な情報:
- 私は私のクラスの直列化(酸洗)動作を定義するためにこれをやっています。
- のPython 2.7
親クラスに__getstate__()
と__setstate__()
を定義すると、子はこれらのメソッドを継承できますか? this SO answerにいくつかの関連する議論がありますが、先行する二重アンダースコア(dunder)を持つメソッドについてのみです。dunderメソッドは継承されていますか?
いくつかの余分な情報:
はい、dunderの方法がうまく継承されます。そこの答えからは、リンクされたドキュメントはReserved classes of identifiersです:
__*__
システム定義の名前。これらの名前は、インタープリタとその実装(標準ライブラリを含む)によって定義されます。現在のシステム名については、「特別なメソッド名」セクションなどで説明しています。 Pythonの将来のバージョンでは、もっと多くの機能が定義されるでしょう。__*__
の名前の使用は、明示的に文書化された使用に従わない名前で、警告なしに破損することがあります。__*
からクラス・プライベート名別のクラスである
。
と連結他の部分はまだ、おそらく明確であるIdentifiers (Names)ある:
テキストでクラス定義で発生した識別子は、2つの以上の下線文字で始まり、二つ以上の下線で終わりませんの場合は、そのクラスのというのプライベートネームと見なされます。
太字強調鉱山; 2つのアンダースコアで始まり2つのアンダースコアで終わる名前は、のクラスプライベートの名前ではありません。
の両方のクラスが継承されていることに注意してください(継承は、クラスのMRO内の属性名を調べることによって機能します)。その名前は、なぜ名前が最初にmangledされている継承されてからそれらを防ぐことはありませんmangledです。このような名前の前に_ClassName
という接頭辞を付けることで、サブクラスは名前を再利用でき、自動的には衝突しません。接頭辞は_SubClass
です。
ああ、私はドキュメントでそれを逃した!ありがとうございました:) – BoltzmannBrain
@BoltzmannBrain:両方のクラスのクラスは上手く継承されています。名前は隠されていない* mangled *です。 –
@MSeifertクラスとプライベートクラスのプライベート属性間の名前の衝突を避けるため、@MSeifertクラスのプライベートな名前(つまり '__ *')は、マングルされたフォームを使うために書き直されています。私は、この舟の中に雨のようなダンダーの方法があるかどうかは分かりません。 – BoltzmannBrain
「プライベート属性」として分類されていないため、これらはありません(「少なくとも2つの先頭のアンダースコア、末尾に1つ下のアンダースコア」と定義されています)。https://docs.python.org/2 /tutorial/classes.html#private-variables-and-class-local-references – MSeifert