当我们对线程类进行子类化时,是在我们新类的__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 属性 当我创建新的时,只需添加这些属性 子类
答案 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