OOP 和线程子类

OOP and Threading subclass

当我们子class 线程 class 时,是在我们新的 class 的 __init__ 方法中调用原始线程 __init__ 方法,本质上只是把石板擦干净? 还是我们继承了原来的__init__方法的属性?

这就是原始 __init__ 查找线程的方式 class(缩略形式)

 def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, *, daemon=None):



        if kwargs is None:
            kwargs = {}
        self._target = target
        self._name = str(name or _newname())
        self._args = args
        self._kwargs = kwargs

所以现在当我创建一个 subclass 并定义我的 int 时:

class MyThread(threading.Thread):

    def __init__(self, number):
        threading.Thread.__init__(self)
        self.number = number
        print(number)

这是否意味着我正在覆盖原来的线程 classes init属性如

group=None, target=None, name=None,
    args=(), kwargs=None, *, daemon=None

因此只能访问我在我的文件中创建的一个属性编号 新的 init 方法。

如果是这样,有没有办法仍然可以访问原始 init 属性 当我创建新的时,只需在这些属性之上添加 子class?

您当前的子类只能使用默认参数实例化一个 Thread

为避免必须重写参数,可以使用如下形式:

def __init__(self,
             subclass_positional_arg, *args,
             subclass_kw_arg=None, other_arg=None, **kwargs):
    super(MyThread, self).__init__(*args, **kwargs)
    # Do stuff with `subclass_positional_arg`, 
    # `subclass_kw_arg` and `other_arg`

你可以像这样实例化它:

MyThread(positional, subclass_kw_arg=value)
MyThread(positional)

根据您的具体情况,您可以执行以下两项操作之一:

def __init__(self, *args, number, **kwargs):
    super(MyThread, self).__init__(*args, **kwargs)
    self.number = number

MyThread(number=<number>)  # You could also give a default value
def __init__(self, number, *args, **kwargs):
    super(MyThread, self).__init__(*args, **kwargs)
    self.number = number

MyThread(<number>)
# or
MyThread(number=<number>)
# Though you could no longer give a default value

在Python 2 中,不允许仅使用关键字参数。您可以通过从 **kwargs

弹出来实现类似的效果
def __init__(self, *args, **kwargs):
    # Use `kwargs.pop('number', <default value>)` to be optional
    number = kwargs.pop('number')
    super(MyThread, self).__init__(*args, **kwargs)
    self.number = number