你做错了很多事情。不幸的是,我不使用monkeyrunner
,所以我无法为您提供与库本身相关的详细信息。
您的代码的作用类似于以下内容:
>>> 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
注意如何device
不是实例Device
。原因是您的__new__
方法不是返回一个Device
实例,而是一个MonkeyRunner
实例。您在问题中链接的答案指出:
无论如何,要实现您想要的,您应该使用 custom
__new__
而不是创建一个类,从工厂__init__
获取您的实例并将您的东西注入实例或它的类/基础/等。MonkeyDevice
这意味着您应该执行以下操作:
>>> 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
然而,这根本没有用,因为它Device
可能只是一个函数:
>>> def Device():
... def test():
... print "I'm test"
... inst = MonkeyRunner()
... inst.test = test
... return inst
...
>>> device = Device()
>>> device.test()
I'm test
AFAIK 你不能子类MonkeyRunner
化并从它的方法创建实例waitForConnection
,至少如果waitForConnection
是staticmethod
.
我要做的是使用委托:
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"