2017-05-05 3 views
2

threading.Threadクラスを作成すると、threading.Thread.__init__(self)またはsuper(ClassName, self).__init__()を強制的に使用するのはなぜですか?例えばなぜクラスでスレッド.__ init __()が必要なのですか?

class Threader(threading.Thread): 
    def __init__(self, _fp, _q): 
     threading.Thread.__init__(self) 
     self.path = _fp 
     self.queue = _q 

    def run(self): 
     # Do stuff 

または

class Threader(threading.Thread): 
    def __init__(self, _fp, _q): 
     super(Threader, self).__init__() 
     self.path = _fp 
     self.queue = _q 

    def run(self): 
     # Do stuff 

どちらの方法が働く、とほぼ同じことを行います。しかし、どちらかの方法を取り除いても.__init__()の場合は、スタックに入れます:from thread.start(): thread.__init__() not called

自分自身を定義してはならないdef __init__().__init__()メソッドの「置き換え」ですか?

私はthis他のSOの投稿を読んだことがあり、それは私が思ったものと一致して、同じスタックエラーが発生します。

+1

なぜ「スレッド」クラスを改良するのですか?なぜ、 'Thread'をインスタンス化してそれを呼び出し可能なデリゲートにするのはなぜですか? 'my_thread = threading.Thread(target = my_callable)' –

+0

@jameslarge構文は、GUIの更新でやっていることのほうがきれいです。 –

答えて

3

は、この簡単な例を考えてみましょう。このクラスのユーザーは、私たちがオーバーライドした特定のサウンド(それが作るサウンド)を除いて、すべてのデフォルトのアスペクトにおいて、犬のように動作することを合理的に期待します。しかし、指摘したように、新しいサブクラス__init__は、基本クラス__init__を置き換えます。 完全にが代わります。 C++とは異なり、サブクラスインスタンスが作成されると、基本クラスの初期化コードはではなく、が自動的に呼び出されます。したがって、chihuahua()を作成すると、self.legs = 4行が実行されることはありません。その結果、このタイプの犬はどれくらいの足を持っているか分かりません。したがって、あなたはそれが完全に機能する犬ではないと主張することができ、複雑なトリックを実行しようとしている間に倒れても驚くべきではありません。

サブクラス設計者は、これを修正する2つの方法があります。最初は、self.legs = 4行をサブクラスで明示的に再実装することです。この例では正常に動作しますが、一般的にはDRYの原則に違反しているので、の場合はのコードを書いて、どのように保守するかを正確に知っています。さらに複雑な例(Threadのサブクラスのような)では、おそらくが知りません。 2番目のオプション:明示的にスーパークラスの初期化子を呼び出して、そのことをさせてください。

1

独自の__init__を定義すると、基本クラスがオーバーライドされます。しかし、ベース__init__がスレッドを実行可能にするすべての作業はどうでしょうか?通常作成されるすべての変数と状態がありません。あなた自身の中のすべてをハックしない限り(そしてそれはなぜですか?)スレッドはもちろん完全に解き放たれません。

もちろん、すべてのクラスで__init__が必要なわけではありませんが、大部分がそうしています。そうでないものであっても、__init__を呼び出すことは無害です。最終的に__init__が有用であると実装者が判断した場合は、object.__init__に進み、将来的に子クラスを証明します。私たちは、chihuahuaと呼ばれるdogのサブクラスを、作成した

class dog: 
    def __init__(self): 
     self.legs = 4 
     self.sound = 'woof' 

class chihuahua(dog): 
    def __init__(self): 
     self.sound = 'yip' 
     # what's missing here? 

関連する問題