从Objective-C调用Python
我正在开发一个用Python和ObjC写的应用程序,我需要从ObjC中调用一些Python类里的方法。可是我尝试了很多方法都没有成功。
- 我该怎么从Objective-C调用Python的方法呢?
- 我的Python类是在Interface Builder中创建的。我该怎么从那个实例中调用方法呢?
1 个回答
18
可以使用 PyObjC。
这个工具在 Leopard 及以后的版本中自带。
>>> from Foundation import *
>>> a = NSArray.arrayWithObjects_("a", "b", "c", None)
>>> a
(
a,
b,
c
)
>>> a[1]
'b'
>>> a.objectAtIndex_(1)
'b'
>>> type(a)
<objective-c class NSCFArray at 0x7fff708bc178>
它甚至可以和 iPython 一起使用:
In [1]: from Foundation import *
In [2]: a = NSBundle.allFrameworks()
In [3]: ?a
Type: NSCFArray
Base Class: <objective-c class NSCFArray at 0x1002adf40>
`
如果想从 Objective-C 调用 Python,最简单的方法是:
在 Objective-C 中声明一个抽象的父类,这个类里包含你想要调用的 API
在这个类的 @implementation 中创建方法的空实现
在 Python 中继承这个类,并提供具体的方法实现
在抽象父类中创建一个工厂方法,用来生成具体子类的实例
也就是说:
@interface Abstract : NSObject
- (unsigned int) foo: (NSString *) aBar;
+ newConcrete;
@end
@implementation Abstract
- (unsigned int) foo: (NSString *) aBar { return 42; }
+ newConcrete { return [[NSClassFromString(@"MyConcrete") new] autorelease]; }
@end
.....
class Concrete(Abstract):
def foo_(self, s): return s.length()
.....
x = [Abstract newFoo];
[x foo: @"bar"];