OOP和Threading子类

时间:2017-08-07 17:08:00

标签: python oop python-multithreading

当我们对线程类进行子类化时,是在我们新类的__init__方法中调用原始线程__init__方法,基本上只是擦除了清单? 或者我们是否继承了原始__init__方法的属性?

这是原始__init__查找线程类(删节形式)

的方式
 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

所以现在当我创建一个子类并对我的 int 进行def:

class MyThread(threading.Thread):

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

这是否意味着我要覆盖原始的线程类 init 属性,例如

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

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

如果是这样,是否还有办法可以访问原始的 init 属性 当我创建新的时,只需添加这些属性 子类

1 个答案:

答案 0 :(得分:1)

您当前的子类只能使用默认参数实例化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