如何从MonkeyDevice继承?
我想扩展monkeyrunner API中的MonkeyDevice类。我的派生类看起来是这样的。
from com.android.monkeyrunner import MonkeyDevice, MonkeyRunner
class TestDevice(MonkeyDevice):
def __init__(self, serial=None):
MonkeyDevice.__init__(self)
self = MonkeyRunner.waitForConnection(deviceId=serial)
self.serial = serial
当我从另一个模块调用 test_dev = TestDevice(serial)
时,出现了以下错误:
test_dev = TestDevice(serial)
TypeError: _new_impl(): 1st arg can't be coerced to com.android.monkeyrunner.core.IMonkeyDevice
我哪里做错了呢?
提前谢谢你们!
2 个回答
1
看起来你想要扩展一个通过工厂方法 waitForConnection
返回的 MonkeyDevice
实例。
当你在构造函数里尝试替换 self
时会出现错误(?)。我怀疑你是在使用 Jython,因为如果是 CPython 这里不会报错,反而会创建一个本地变量 self
,然后这个变量的值就丢失了。
无论如何,要实现你想要的功能,你应该创建一个自定义的类,使用 __new__
而不是 __init__
,从工厂获取你的 MonkeyDevice
实例,然后把你的东西注入到这个实例或者它的类、基类等里面。
另外,你也可以把 MonkeyDevice
包装到另一个类里,通过 __getattr__
和 __setattr__
来传递类似猴子的方法调用和成员访问。
1
看起来你不能直接创建一个 MonkeyDevice
的实例,而是需要先调用一个工厂函数 waitForConnection
。所以你需要在你的 __new__()
函数里给 self
赋值,这样 MonkeyDevice
才能在你调用它的 __init__
方法之前,识别这个实例是从 IMonkeyDevice
继承来的。
示例:
class TestDevice(MonkeyDevice):
def __new__(self, serial=None):
return MonkeyRunner.waitForConnection(deviceId=serial)
def __init__(self):
MonkeyDevice.__init__(self)