如何在python3中重载Thread类的__init__函数?

时间:2016-10-31 10:20:42

标签: python multithreading python-3.x oop


我想尝试移植到python3 this answer。但我不知道如何在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) 部分问题是我不明白如何处理函数减速中的星号*。解释它的用途也会有所帮助。

只需使用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)

1 个答案:

答案 0 :(得分:1)

如果您需要重载它,请注意如何构建*调用(或任何调用Foo)以明确裸class Foo: def __init__(self, b=30, *, c=40): print(b, c) 之后的参数(即以密钥形式提供它们:

例如,如果您有一个c=<value>类,其签名为:

FooChild

每当你调用它时,你都需要提供一个class FooChild(Foo): def __init__(self, a, myval_1, my_val2): print(a) super().__init__(b, c=my_val2) 参数。因此,例如,如果您通过以下方式在c类中重载它:

BaseClass.__init__

调用*args时,您需要提供名称**kwargs

如果您有c__init__,则在调用子类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__调用。您需要<a href="tel:XXXXXXXXXX">Call me!</a> 传递给document.location.href = "tel:XXXXXXXXXX"; ,它需要它。