2009-08-20 32 views
7

我正在開發一個Python/ObjC應用程序,我需要調用一些方法從ObjC我的Python類調用的Python。 我嘗試了幾件沒有成功的東西。從Objective-C的

  • 如何從Objective-C調用Python方法?
  • 我的Python類正在Interface Builder中實例化。我怎樣才能從這個實例調用一個方法?

回答

16

使用PyObjC。

它包括豹&以後。

>>> 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的類中的方法存根實現,並提供具體的實現

  • 創建抽象超類工廠方法創建具體子類的實例

iee

@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"]; 
+0

我不明白這是如何工作。例如,我假設如下: (1)把Python代碼在一個文件Concrete.py (2)把OBJ-C代碼Abstract.h /平方米 鑑於這種情況,你建立這個究竟怎麼辦程序? – Fooberman 2012-04-26 02:26:59

+0

更新:有澄清這張票:[鏈接](http://stackoverflow.com/questions/1772491/call-from-objective-c-into-python) – Fooberman 2012-04-26 02:31:24

+0

是這個失蹤「MyConcrete」後一個右括號? – 2013-05-26 02:00:38