2009-08-20 13 views
7

Sto sviluppando un'applicazione Python/ObjC e ho bisogno di chiamare alcuni metodi nelle mie classi Python da ObjC. Ho provato diverse cose senza successo.Chiamare Python da Objective-C

  • Come posso chiamare un metodo Python da Objective-C?
  • Le mie classi Python vengono istanziate in Interface Builder. Come posso chiamare un metodo da quell'istanza?

risposta

16

Utilizzare PyObjC.

È incluso in Leopard & in seguito.

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

funziona anche con ipython:

In [1]: from Foundation import * 

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

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

`

Per chiamare da Objective-C in Python, il modo più semplice è quello di:

  • dichiarano un abstract superclasse in Objective-C che contiene l'API che si desidera chiamare

  • creano implementazioni stub dei metodi @implementation della classe

  • sottoclasse della classe in Python e forniscono implementazioni concrete

  • creano un metodo factory sulla superclasse astratta che crea istanze sottoclasse concreta

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

Non vedo come funziona. Per esempio, sto assumendo quanto segue: (1) inserisci il codice python in un file Concrete.py (2) inserisci il codice obj-c in Abstract.h/m Dato che, esattamente come lo costruisci programma? Aggiornamento – Fooberman

+0

: C'è un chiarimento su questo ticket: [link] (http://stackoverflow.com/questions/1772491/call-from-objective-c-into-python) – Fooberman

+0

Manca una parentesi chiusa dopo "MyConcrete"? –