python - 从 Objective-C 调用 Python

标签 python objective-c cocoa

我正在开发一个 Python/ObjC 应用程序,我需要从 ObjC 调用我的 Python 类中的一些方法。 我试过几种东西都没有成功。

  • 如何从 Objective-C 调用 Python 方法?
  • 我的 Python 类正在 Interface Builder 中实例化。如何从该实例调用方法?

最佳答案

使用 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 的抽象父类(super class)

  • 在类的@implementation 中创建方法的 stub 实现

  • 在 Python 中子类化该类并提供具体实现

  • 在创建具体子类实例的抽象父类(super class)上创建工厂方法

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

关于python - 从 Objective-C 调用 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1308079/

相关文章:

python - 如何为 Go to/on the Python Interpreter 创建一个运行时环境?

python - 如何在单个虚拟主机上服务 django 和 gatsby?

python - Numpy load() 内存溢出导致段错误

ios - 在不重新加载的情况下为 UITableViewCell subview 中的帧更改设置动画的最佳方法

objective-c - Cocoa - 输出数组文本

Python - 使用线程或队列迭代调用函数的 for 循环

ios - iPhone-录制后保存音频时出现问题

iphone - UIToolbar 上的按钮间距

iphone - 我如何感知用户将手指按住屏幕而不移动?

swift - 如何将 NSTextField 值转换为 CGFloat