Skip to content

多版オブジェクトを継承する際の振る舞い #1

@satsuki942

Description

@satsuki942

概要

あるクラスから多版オブジェクトクラスを継承する際の振る舞いが、現在のアーキテクチャでは正しく解決できない。
(多版オブジェクトクラスが通常のクラスを継承するケースでは問題は発生しない。)

問題の根本はPythonと提案言語の実装方針の相違:

  1. Python:継承の際、親クラスのselfが指すのは呼び出し元の子クラスのオブジェクト
    ・全てのインスタンス属性は単一のは子クラスのオブジェクトに記録
  2. 提案言語:ディスパッチ機構や属性参照/更新は、selfが自身のクラスのオブジェクトであると仮定
    ・フィールドの実体は自身のクラスのラッパーオブジェクトに記録
    ・メソッドディスパッチはself._current_state.~~のように行われるが、ここでselfは自身のクラスのオブジェクトを仮定

この相違の結果、例えば親クラス内のディスパッチ時のself._current_state.~~の呼び出しが、子クラスの呼び出しにジャンプしてしまう。


暫定的な実装方針

現在、多版オブジェクトクラスから通常のクラスへの継承をサポートするために以下の方針で実装を行っている。
これは、あくまで課題を明確化するための暫定的な実装である。

  1. ラッパーオブジェクトにおける多重継承:
    ラッパーオブジェクトは、そのクラスの全てのバージョンが継承するユニークな親クラスを全て多重継承する。
    ※ 上記の問題とは独立に、継承されている名前が異なる親クラスが同じシグネチャのメソッドを持っていた場合、メソッド解決順序(MRO)によっては間違った振る舞いをする可能性がある。つまり、期待と異なるバージョンどころか、期待と異なる良く分からないクラスのメソッドを呼び出してしまう可能性がある。
  2. _Implクラス内でのsuper()呼び出しの書き換え:
    _Implクラス内でsuper()が呼び出された場合、それが親クラスのメソッドを、ラッパーオブジェクト自身の文脈で(つまり、ラッパーがselfとして)実行するように、静的に書き換えられる。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions