【问题标题】:How to overload the __init__ function of the Thread class in python3?python3中如何重载Thread类的__init__函数?
【发布时间】:2016-10-31 10:20:41
【问题描述】:


我正在尝试移植到 python3 this answer。但是我不确定如何在python3中设置Thread.__init__函数。

一个python2Thread.__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

python3Thread.__init__应该怎么写?

更新,示例中的python2调用为:

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

我的逻辑怎么会说这在 python3 中可以工作,但事实并非如此,答案应该包括如何调用它,或说明如何构建它,包括 kwargs:

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

【问题讨论】:

  • * 强制调用者对星号之后的所有内容使用 kwargs。

标签: python multithreading python-3.x oop


【解决方案1】:

如果您需要重载它,请注意如何构造您的 super 调用(或任何高达 Thread.__init__ 的调用)以明确说明 * 之后的参数(即以密钥形式提供它们):

例如,如果您有一个 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)

您需要在拨打BaseClass.__init__ 时提供姓名c

如果您有*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__,它需要它。

【讨论】:

  • 我不能做一些涉及卡格斯的事情吗?我提供的例子是这样使用它的:``Thread.__init__(self, group, target, name, args, kwargs, Verbose), where kwargs is used when calling Thread.__init__``
  • 当然可以@GuySoft,你只需要一直提供cThread.__init__;你以什么方式做这无关紧要,你只需要以某种方式通过它。
  • 好的,一切正常!我还发布了full code answer on the thread
  • 太棒了@GuySoft,点赞。移植流行且有些复杂的答案是更多人应该考虑做的事情。
猜你喜欢
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2010-09-13
相关资源
最近更新 更多