从Objective-C调用Python

7 投票
1 回答
7571 浏览
提问于 2025-04-15 13:45

我正在开发一个用Python和ObjC写的应用程序,我需要从ObjC中调用一些Python类里的方法。可是我尝试了很多方法都没有成功。

  • 我该怎么从Objective-C调用Python的方法呢?
  • 我的Python类是在Interface Builder中创建的。我该怎么从那个实例中调用方法呢?

1 个回答

18

可以使用 PyObjC。

这个工具在 Leopard 及以后的版本中自带。

>>> 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 中继承这个类,并提供具体的方法实现

  • 在抽象父类中创建一个工厂方法,用来生成具体子类的实例

也就是说:

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

撰写回答