2013-05-02 4 views
0

여기에 나온 해결책을 따라 기능을 확장하여 Device 클래스에 기능을 추가했습니다. How to inherit from MonkeyDevice?MonkeyDevice를 상속받는 Python 클래스

오류 개체에 '테스트'특성이 없습니다. 내 클래스 인스턴스가 MonkeyDevice 유형 인 것 같습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage 

class Device(MonkeyDevice): 

    def __new__(self): 
     return MonkeyRunner.waitForConnection(10) 
    def __init__(self): 
     MonkeyDevice.__init__(self) 
    def test(): 
     print "this is test" 

device = Device() 
device.test(self) 

답변

1

많은 일을 잘못하고 있습니다. 불행히도 monkeyrunner을 사용하지 않으므로 라이브러리 자체와 관련된 세부 사항을 도울 수는 없습니다. device하지Device 예를 얼마나

>>> class MonkeyRunner(object): pass 
... 
>>> class Device(MonkeyRunner): 
...  def __new__(self): 
...    return MonkeyRunner() 
...  def __init__(self): 
...    super(Device, self).__init__() 
...  def test(): 
...    print "This is test" 
... 
>>> device = Device() 
>>> device.test(self) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'MonkeyRunner' object has no attribute 'test' 
>>> device 
<__main__.MonkeyRunner object at 0xb743fb0c> 
>>> isinstance(device, Device) 
False 

참고 : 코드가 무엇을

는 다음과 같은 것입니다. 이유는 __new__ 메서드가 Device 인스턴스를 반환하지 않고 MonkeyRunner 인스턴스를 반환하기 때문입니다. 당신이 당신의 질문에 링크 된 대답은 상태 : 어쨌든

당신이, __init__보다 __new__ 아니라 정의와 클래스를 만드는 공장 에서 MonkeyDevice 예를 을 얻고로 물건을 주입해야 원하는 것을 달성하기 위해 예 또는 클래스/기지/등입니다. 당신 AFAIK

>>> def Device(): 
...  def test(): 
...    print "I'm test" 
...  inst = MonkeyRunner() 
...  inst.test = test 
...  return inst 
... 
>>> device = Device() 
>>> device.test() 
I'm test 

: 당신이 같은 짓을한다는 뜻

다음 Device 단순히 함수가 될 수 있기 때문에

>>> class Device(MonkeyRunner): 
...  def __new__(self): 
...    inst = MonkeyRunner() 
...    inst.test = Device.test 
...    return inst 
...  @staticmethod 
...  def test(): 
...    print "I'm test" 
... 
>>> device = Device() 
>>> device.test() 
I'm test 

그러나 이것은 전혀 유용하지 않다 최소 waitForConnectionstaticmethod 인 경우 MonkeyRunner의 하위 클래스를 만들고 waitForConnection 메서드에서 인스턴스를 만들 수 없습니다.

class Device(object): 
    def __init__(self): 
     self._device = MonkeyRunner.waitForConnection(10) 
    def __getattr__(self, attr): 
     return getattr(self._device, attr) 
    def test(self): 
     print "I'm test" 
+0

답장을 보내 주신 모든 분께 특히 감사드립니다. – user2344495

1

__new__ 실제로 객체를 인스턴스화하는 데 사용하는 방법입니다 : 내가 할 거라고 무엇

위임을 사용하는 것입니다. 우선 순위를 재정 의하여 MonkeyRunner.waitForConnection이 반환 한 값을 명시 적으로 반환 했으므로 device는 실제로 Device 클래스의 인스턴스가 아닙니다.

__new__을 무시해야하는 경우는 드뭅니다.

편집 됨 좋아,이 링크 된 답변에서 볼 수있는 경우입니다. 미성년자 참고로 Python docs

, __new__에 대한 첫 번째 인수가 규칙에 의해 오히려 자기보다 CLS : Bakuriu의 답변 __new__에 대한 문서를하는 것처럼 개체를 인스턴스화하는 특수 생성자를 사용할 필요와 함께 작동하는 몇 가지 방법을 보여줍니다 인스턴스가 아닌 클래스 객체 자체이기 때문입니다.