2016-10-31 9 views
3


私はpython3に移植しようとしていますthis answer。しかし、私はThread.__init__関数をpython3で設定する方法がわかりません。スレッドクラスのPython3でThreadクラスの__init__関数をオーバーロードする方法は?

python2 Thread.__init__の減速は、次のとおりです。

Thread.__init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None) 

しかし、そののpython3:

Thread.__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None) 

注:のpython3で終わるがある:問題のargs=(), kwargs=None, *, daemon=None) 一部はIであります機能の減速時にアスタリスク*を処理する方法を理解していない。それが何であるかを説明することも役立ちます。ただ、python2を使用して

が発生しますTypeError: __init__() takes from 1 to 6 positional arguments but 7 were given

にはどうすればのpython3 Thread.__init__を書くべきですか?

更新、例のpython2コールは次のとおりです。

Thread.__init__(self, group, target, name, args, kwargs, Verbose) 

私のロジックは、これはのpython3に働くだろうと言うでしょうが、それは、答えはこれを呼び出す方法を含めるべきではありませんどのように、またはkwargsから含めて、それを構築する方法を指示:

Thread.__init__(self, group, target, name, args, kwargs, daemon) 
+0

'*'は、発信者が星の後のすべてに対してkwargsを使用するよう強制します。 – erip

答えて

1

をあなたはそれをオーバーロードする必要がある場合は、ちょうどあなたが(Thread.__init__まで、または任意のコール)あなたのsuperコールを構築する方法を注意するARについて明示します後guments裸*(すなわち、キーの形でそれらを提供する):たとえば

、あなたはの署名でFooクラスを持っている場合:

class Foo: 
    def __init__(self, b=30, *, c=40): 
     print(b, c) 

あなたはいつでもあなたc=<value>引数を提供する必要があるだろうそれを呼び出す。あなたがBaseClass.__init__を呼び出すときに名前cを提供する必要があります

class FooChild(Foo): 
    def __init__(self, a, myval_1, my_val2): 
     print(a) 
     super().__init__(b, c=my_val2) 

:だから、たとえば、場合によってはFooChildクラスでそれをオーバーロード。

あなたは*argsを持っていると**kwargs子クラス__init__を呼び出すときにもう一度だけ、すなわち、明示的にcの値を提供する必要があります場合:

class FooBase(Foo): 
    def __init__(self, a, *args, **kwargs): 
     print(a) 
     super().__init__(*args, **kwargs) 

FooBase(1, 2, c=30)によって呼び出されるが、FooBase(1, 2, d=30)またはFooBase(1, 2, 30)を好きではないことができます。 cから__init__に渡る必要があります。

+0

kargsに関係することはできませんか?私が提供した例では、 '' Thread .__ init __(self、group、target、name、args、kwargs、Verbose) ''のように使います。ここでkwargsは '' Thread .__ init__''を呼び出すときに使われます。 – GuySoft

+0

もちろん@GuySoft、あなたは常にスレッドに 'c'を提供する必要があります。__init__';どのようなやり方でそれは無関係なのですか、何とかそれを渡す必要があります。 –

+1

それはすべての仕事を得ました!そして、私も[スレッド上の完全なコードの回答を投稿](http://stackoverflow.com/a/40344234/311268) – GuySoft

関連する問題