2017-08-07 79 views
1

当我们对线程类进行子类化时,在我们新类的__init__方法中调用原始线程__init__方法,基本上只是擦除板子干净? 还是我们继承了原来的__init__方法的属性?OOP和线程子类

这是原来__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 

所以现在当我创建一个子类和DEF我INT这样:

class MyThread(threading.Thread): 

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

不这意味着我覆盖原始线程类 初始属性如

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

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

如果是这样,是有办法仍然可以访问原来的初始化属性 ,只是添加这些属性的顶部,当我创建我的新 子类?

+0

没有弹出达到类似的效果,您将有机会获得你调用任何方法分配给'self'任何属性,包括基础类'__init__'。 –

回答

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 
+0

谢谢=)。去测试你的建议,看看我是否还有其他问题。 – Moondra