2009-08-20 31 views
7

Tôi đang phát triển một ứng dụng Python/ObjC và tôi cần gọi một số phương thức trong các lớp Python của tôi từ ObjC. Tôi đã thử một số nội dung không thành công.Gọi Python từ mục tiêu-C

  • Tôi có thể gọi phương thức Python từ Objective-C bằng cách nào?
  • Các lớp Python của tôi đang được khởi tạo trong Trình tạo giao diện. Làm thế nào tôi có thể gọi một phương thức từ ví dụ đó?

Trả lời

16

Sử dụng PyObjC.

Nó được bao gồm với Leopard & sau đó.

>>> 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> 

Nó thậm chí làm việc với ipython:

In [1]: from Foundation import * 

In [2]: a = NSBundle.allFrameworks() 

In [3]: ?a 
Type:  NSCFArray 
Base Class: <objective-c class NSCFArray at 0x1002adf40> 

'

Để gọi từ Objective-C vào Python, cách dễ nhất là:

  • tuyên bố một bản tóm tắt siêu lớp trong Mục tiêu-C chứa API bạn muốn gọi

  • tạo triển khai còn sơ khai của phương pháp trong @implementation của lớp

  • lớp lớp bằng Python và cung cấp triển khai cụ thể

  • tạo ra một phương pháp nhà máy trên lớp cha trừu tượng tạo ra trường hợp lớp bê tông

Tức là

@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

Tôi không thấy cách hoạt động của tính năng này. Ví dụ, tôi giả định như sau: (1) đặt mã python trong một tệp Concrete.py (2) đặt mã obj-c trong Abstract.h/m Cho rằng, làm thế nào chính xác bạn xây dựng này chương trình? – Fooberman

+0

Cập nhật: Có làm rõ trên vé này: [link] (http://stackoverflow.com/questions/1772491/call-from-objective-c-into-python) – Fooberman

+0

Điều này có thiếu dấu đóng ngoặc sau "MyConcrete" không? –