2017-06-08 2 views
0

親クラスに__getstate__()__setstate__()を定義すると、子はこれらのメソッドを継承できますか? this SO answerにいくつかの関連する議論がありますが、先行する二重アンダースコア(dunder)を持つメソッドについてのみです。dunderメソッドは継承されていますか?

いくつかの余分な情報:

  • 私は私のクラスの直列化(酸洗)動作を定義するためにこれをやっています。
  • のPython 2.7
+0

@MSeifertクラスとプライベートクラスのプライベート属性間の名前の衝突を避けるため、@MSeifertクラスのプライベートな名前(つまり '__ *')は、マングルされたフォームを使うために書き直されています。私は、この舟の中に雨のようなダンダーの方法があるかどうかは分かりません。 – BoltzmannBrain

+1

「プライベート属性」として分類されていないため、これらはありません(「少なくとも2つの先頭のアンダースコア、末尾に1つ下のアンダースコア」と定義されています)。https://docs.python.org/2 /tutorial/classes.html#private-variables-and-class-local-references – MSeifert

答えて

5

はい、dunderの方法がうまく継承されます。そこの答えからは、リンクされたドキュメントはReserved classes of identifiersです:

__*__
システム定義の名前。これらの名前は、インタープリタとその実装(標準ライブラリを含む)によって定義されます。現在のシステム名については、「特別なメソッド名」セクションなどで説明しています。 Pythonの将来のバージョンでは、もっと多くの機能が定義されるでしょう。 __*__の名前の使用は、明示的に文書化された使用に従わない名前で、警告なしに破損することがあります。__*からクラス・プライベート別のクラスである

と連結他の部分はまだ、おそらく明確であるIdentifiers (Names)ある:

テキストでクラス定義で発生した識別子は、2つの以上の下線文字で始まり、二つ以上の下線で終わりませんの場合は、そのクラスのというのプライベートネームと見なされます。

太字強調鉱山; 2つのアンダースコアで始まり2つのアンダースコアで終わる名前は、のクラスプライベートの名前ではありません。

の両方のクラスが継承されていることに注意してください(継承は、クラスのMRO内の属性名を調べることによって機能します)。その名前は、なぜ名前が最初にmangledされている継承されてからそれらを防ぐことはありませんmangledです。このような名前の前に_ClassNameという接頭辞を付けることで、サブクラスは名前を再利用でき、自動的には衝突しません。接頭辞は_SubClassです。

+0

ああ、私はドキュメントでそれを逃した!ありがとうございました:) – BoltzmannBrain

+1

@BoltzmannBrain:両方のクラスのクラスは上手く継承されています。名前は隠されていない* mangled *です。 –

関連する問題