web-dev-qa-db-ja.com

Python継承-子クラス内で基本クラスのメソッドを呼び出しますか?

これについての明確な説明がどこにも見つからないのは、私を困惑させます。子クラスの同じ名前のメソッド内で基本クラスのメソッドを呼び出す必要があるのはなぜですか。

class Child(Base):
    def __init__(self):
        Base.__init__(self)

    def somefunc(self):
        Base.somefunc(self)

基本クラスのメソッドを完全に上書きしたくない場合にこれを行うと思います。本当にそれだけですか?

16
user1369281

通常、これは、基本クラスのメソッドを完全に置き換えるのではなく、変更して機能を拡張する場合に行います。 defaultdictはこの良い例です:

class DefaultDict(dict):
    def __init__(self, default):
        self.default = default
        dict.__init__(self)

    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            result = self[key] = self.default()
            return result

これを行う適切な方法は 基本クラスを直接呼び出す代わりにsuperを使用する であることに注意してください。そのようです:

class BlahBlah(someObject, someOtherObject):
    def __init__(self, *args, **kwargs):
        #do custom stuff
        super(BlahBlah, self).__init__(*args, **kwargs) # now call the parent class(es)
13
Joel Cornett

それは完全にクラスとメソッドに依存します。

基本メソッドの実行前/実行後に何かを実行したい場合、または異なる引数を使用して呼び出したい場合は、明らかにサブクラスのメソッドで基本メソッドを呼び出します。

メソッド全体を置き換えたい場合は、明らかにそれを呼び出さないでください。

2
ThiefMaster