子类的 run 覆盖了父类的 run,但是子类 run 里边没有调用父类 run 的代码
def run(self):
super(MyThread, self).run()
print ' I am a thread.'
看看你是不是要这个效果
open 函数返回了一个_open,其中_open 经过 param_to_property 装饰器变成了一个 Wrapper 实例。
在这个 Wrapper 实例被初始化时,构造函数的 func 参数被传递进来了一个原始的_open 函数对象,存储在成员变量 self.func 中。
本身 param_to_property 是返回一个 Wrapper 类对象的,但是由于 param_to_property 装饰器是以 (action=["notification", "quick_settings"]) 的形式使用的,所以 prop 和 kwprops 被占了,于是_open 函数对象会顺势传递给装饰器【返回的对象】上,怎么传递呢,就是把【返回的对象】调用一下,并且把_open 函数对象作为第一个参数传入,因此 Wrapper 类就被调用了,并且传入了一个_open 对象作为首参数 ——也就是 Wrapper 类被初始化了:Wrapper(_open)
Wrapper 实例的生命周期范围内可以访问到 props 和 kwprops 这两个变量,kwprops 的值在你的例子中为{"action": ["notification", "quick_settings"]}。
现在 d.open 就成了 Wrapper 实例,因此 d.open.notification 就等于调用了 getattr 且 attr 参数的值为"notification",可以看到代码里返回 self 实例自身。然后 d.open.notification() 又调用了 Wrapper 实例的 call 方法,于是 call 里边有一行代码
return self.func(*args, **kwargs)
调用了被存储的 func,就是原始的_open 函数对象,并且把处理后的 args 和 kwargs 作为参数传入。在例子里,_open 的第一个参数 action 的值为"notification",至于为什么是"notification"请参考 getattr 和 call 里 if kwprops: 分支里的的代码实现