Как наследовать от MonkeyDevice? - PullRequest
8 голосов
/ 15 сентября 2011

Я хотел бы расширить класс MonkeyDevice API monkeyrunner. Мой производный класс выглядит следующим образом.

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 голос
/ 25 января 2013

Похоже, вы не можете напрямую инициализировать экземпляр MonkeyDevice без вызова заводской функции waitForConnection. Таким образом, вместо этого вам нужно назначить self в вашей функции __new__(), чтобы MonkeyDevice распознал экземпляр как наследующий от IMonkeyDevice, прежде чем вызывать его __init__

Пример:

class TestDevice(MonkeyDevice):
    def __new__(self, serial=None):
        return MonkeyRunner.waitForConnection(deviceId=serial) 
    def __init__(self):
        MonkeyDevice.__init__(self)
1 голос
/ 23 февраля 2012

Кажется, вы пытаетесь расширить экземпляр MonkeyDevice, возвращаемый фабричным вызовом waitForConnection.

. Когда вы пытаетесь заменить self внутри конструктора, вы получаете ошибку (?).Я подозреваю, что вы используете Jython, поскольку CPython здесь не будет жаловаться, вместо этого будет создана локальная переменная self, а ее значение потеряно.

В любом случае, чтобы достичь того, чего вы хотите, вы должны создать класс с пользовательским __new__вместо __init__ получите свой экземпляр MonkeyDevice с фабрики и добавьте свои вещи в экземпляр или его класс / базы / и т.д.

В качестве альтернативы вы можете заключить MonkeyDevice в другой класс и передать monkey-вызовы ish и доступ к элементам через __getattr__ и __setattr__.

...