2011-09-15 11 views
8

Me gustaría extender la clase MonkeyDevice de la API monkeyrunner. Mi clase derivada tiene este aspecto.¿Cómo heredar de 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 

Cuando llamo test_dev = TestDevice(serial) de otro módulo me sale el siguiente error:

test_dev = TestDevice(serial) 
TypeError: _new_impl(): 1st arg can't be coerced to com.android.monkeyrunner.core.IMonkeyDevice 

¿Qué estoy haciendo mal?

¡Gracias de antemano!

+0

¿Qué lenguaje de código es en este? – JPM

+0

@JPM: Esto es Python –

+1

No he usado monkeyrunner, pero por lo que veo ... ¿por qué estás reasignando 'self' ?, quiero decir que estás pasando el original, al constructor de' MonkeyDevice', que si está bien y la forma correcta de hacerlo, ¡entonces estás abandonando ese "yo" !, ¿es esta la manera correcta de hacerlo con monkeyrunner? – cyraxjoe

Respuesta

1

Parece que no se puede inicializar directamente una instancia MonkeyDevice sin una llamada a una función de fábrica waitForConnection. Así que en lugar necesita asignar self en su función de manera que __new__()MonkeyDevice reconoce la instancia como herencia de IMonkeyDevice antes de llamar es __init__

Ejemplo:

class TestDevice(MonkeyDevice): 
    def __new__(self, serial=None): 
     return MonkeyRunner.waitForConnection(deviceId=serial) 
    def __init__(self): 
     MonkeyDevice.__init__(self) 
1

Parece que está intentando ampliar una instancia MonkeyDevice devuelta por la llamada de fábrica waitForConnection.

Cuando intentas sustituir self dentro del construtor, obtienes un error (?). Sospecho que está ejecutando Jython, ya que CPython no se quejaría aquí, sino que se creó una variable local self y se perdió su valor.

De todas formas para lograr lo que quiere usted debe crear una clase con la costumbre __new__ en lugar de __init__, obtener la instancia de MonkeyDevice de la fábrica e inyectar su materia en la instancia o de clase/bases/etc.

Como alternativa, puede ajustar MonkeyDevice en otra clase y pasar llamadas mono-ish y acceso a miembros a través de __getattr__ y __setattr__.

+0

¿esto responde algo? – devin

+0

buen punto, en la segunda mirada el problema es más obvio, reescribiendo la respuesta. –