如何从MonkeyDevice继承?

8 投票
2 回答
782 浏览
提问于 2025-04-17 02:22

我想扩展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)

撰写回答