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
当我们子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