Вызов Python из Objective-C - PullRequest
       10

Вызов Python из Objective-C

7 голосов
/ 20 августа 2009

Я занимаюсь разработкой приложения Python / ObjC, и мне нужно вызвать некоторые методы в моих классах Python из ObjC. Я попробовал несколько вещей без успеха.

  • Как я могу вызвать метод Python из Objective-C?
  • Мои классы Python создаются в Интерфейсном Разработчике. Как я могу вызвать метод из этого экземпляра?

1 Ответ

16 голосов
/ 20 августа 2009

Использовать 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, который вы хотите вызвать

  • создать реализации-заглушки для методов в реализации @ класса

  • подкласс класса в Python и предоставление конкретных реализаций

  • создать фабричный метод на абстрактном суперклассе, который создает конкретные экземпляры подкласса

1031 * Т.е. *

@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"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...