2012-05-02 10 views
16

どこからでもわかりません。 なぜ、子クラスの同じ名前のメソッドの中でベースクラスのメソッドを呼び出す必要がありますか?Pythonの継承 - 子クラスの内部で基本クラスのメソッドを呼び出していますか?

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

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

私は、ベースクラスのメソッドを完全に上書きしたくない場合にこれを行うと思います。それは本当にそこにあるのでしょうか?

答えて

2

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

基本メソッドが実行された後、または異なる引数を使用して呼び出す前に何かをやりたければ、明らかにそのサブクラスのメソッドで基本メソッドを呼び出します。

メソッド全体を置き換える場合は、明らかにメソッドを置き換えないでください。

+0

ただし、親クラス '__init__'を常に呼び出す必要があります。 – Amber

13

通常、変更を加えることで機能を拡張したいが、基本クラスのメソッドを完全に置き換えるわけではない。これを行うための適切な方法がuse super instead of directly calling the base classにあることを

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 

注:defaultdictは、この良い例です。同様に:

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

この「スーパー」機能は何がすばらしいですか? – user1369281

+5

@ user1369281:うーん、いつも素晴らしいとは言えません。しかし、それらを一貫して使用すると、継承ツリーを扱いやすくなります。たとえば、 'defaultdict'をデフォルトの_ordered_dictに変更したいとしたらどうでしょうか? 'super()'を使用した場合、私のコードで変更する必要があるのは、クラス定義です。これらの 'super'は自動的に現在のクラスが継承している基本クラスを参照します。ブラックボックスプログラミングを容易にします。 –

+0

あなたのクラスが複数のクラスを継承できることを思い出させる(または教える)ので、私はこれが好きです。だからあなたの親クラスがlibからのもので、あなたが修正することはできず、すでにオブジェクトを継承していない場合、クラスに 'object'を追加するだけです。 – casey

関連する問題