5

我想通过 PyObjC 访问我 iPhone 的加速度计。这是我的代码:

@objc.signature("v@:@@")
def accelerometer_didAccelerate_(self, accelerometer, acceleration):
    msgBox = UIAlertView.alloc().initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles_("Acceleration", str(acceleration.x), self, "OK", None)
    msgBox.show()
    msgBox.release()

@objc.signature("v@:@")
def applicationDidFinishLaunching_(self, unused):
    self.accelerometer = UIAccelerometer.sharedAccelerometer()
    self.accelerometer.setUpdateInterval_(1)
    self.accelerometer.setDelegate_(self)
    #...

问题是 str(accelleration.x) 返回"<native-selector x of <UIAcceleration: 0x.....>>"。我能做些什么?

4

1 回答 1

8

AUIAccelerationx值在 Objective-C 中定义为propertyacceleration.x在 Python 中访问会为您提供名为 'x' 的方法,而不是您可能期望的名为 'x' 的属性 (ivar)。你需要说:

acceleration._.x

它使用 PyObjC 的“魔术”访问器机制来获取您想要的属性。

原因如下:

Python 的类命名空间的工作方式是,您不能拥有同名的方法和属性。这与 Objective-C 不同,在 Objective-C 中,getter 方法通常与其访问的属性具有相同的名称。

这种差异可能会导致与 Objective-C 2.0 的属性特性的一些混淆,特别是因为两种语言的语法看起来相同。在 Objective-C 中,你写:

NSLog(@"foo's bar: %f", foo.bar);
foo.bar = 10.0;

它会自动使用正确的 setter 或 getter 方法(-bar-setBar:)。由于 Python 的类命名空间规则,PyObjC 不能完全按照 Objective-C 代码所做的那样做,只能选择用名称表示的一件事(方法或属性)foo.bar;它选择的是方法。

于 2011-03-11T10:37:45.763 回答