1. ホーム
  2. python

[解決済み] Pythonの継承と__init__のオーバーライド

2022-06-12 23:36:19

質問

Dive Into Python」を読んでいて、クラスの章にこのような例があります。

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)
        self["name"] = filename

その後、著者は、もしあなたが __init__ メソッドをオーバーライドしたい場合は、明示的に親メソッドである __init__ を正しいパラメータで呼び出す必要があります。

  1. もし、その FileInfo クラスが複数の祖先クラスを持っていたら?
    • 祖先クラスのすべてを明示的に呼び出す必要がありますか? __init__ メソッドを呼び出す必要がありますか?
  2. また、オーバーライドしたい他のメソッドにもこの操作をしなければならないのでしょうか?

どのように解決するのですか?

この本は、サブクラスとスーパークラスの呼び出しに関して少し古いです。 また、組み込みクラスのサブクラス化に関しても少し古いです。

今となってはこんな感じです。

class FileInfo(dict):
    """store file metadata"""
    def __init__(self, filename=None):
        super(FileInfo, self).__init__()
        self["name"] = filename

以下のことに注意してください。

  1. のような組み込みクラスを直接サブクラス化することができます。 dict , list , tuple など。

  2. super 関数は、このクラスのスーパークラスを追跡し、それらの中の関数を適切に呼び出すことを処理します。