2009-08-20 17 views
7

Ich entwickle eine Python/ObjC-Anwendung und ich muss einige Methoden in meinen Python-Klassen von ObjC aufrufen. Ich habe mehrere Sachen ohne Erfolg ausprobiert.Aufruf von Python aus Objective-C

  • Wie kann ich eine Python-Methode von Objective-C aufrufen?
  • Meine Python-Klassen werden in Interface Builder instanziiert. Wie kann ich eine Methode von dieser Instanz aufrufen?

Antwort

16

Verwenden Sie PyObjC.

Es ist im Lieferumfang von Leopard & später enthalten.

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

Es funktioniert sogar mit ipython:

In [1]: from Foundation import * 

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

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

`

zu nennen, von Objective-C in Python, der einfachste Weg ist:

  • eine abstrakte erklären Superklasse in Objective-C, die die API enthält, die Sie aufrufen möchten

  • erstellen Stub-Implementierungen der Methoden in der @implementation Klasse

  • Unterklasse der Klasse in Python und bieten eine Factory-Methode auf der abstrakten Super konkrete Implementierungen

  • erstellen, die Instanzen konkrete Unterklasse

schafft

Ie

@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

Ich sehe nicht, wie das funktioniert. Zum Beispiel nehme ich folgendes an: (1) setze den Python-Code in eine Datei Concrete.py (2) setze den obj-c-Code in Abstract.h/m Gegeben, wie genau erstellst du das Programm? – Fooberman

+0

Update: Es gibt eine Erklärung zu diesem Ticket: [link] (http://stackoverflow.com/questions/1772491/call-from-objective-c-into-python) – Fooberman

+0

Fehlt dies eine schließende Klammer nach "MyConcrete"? –