加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从Objective-C调用Python

发布时间:2020-12-16 04:57:07 所属栏目:百科 来源:网络整理
导读:我正在开发一个 Python / ObjC应用程序,我需要在ObjC的Python类中调用一些方法. 我尝试了几件事没有成功. 如何从Objective-C调用Python方法? 我的Python类正在Interface Builder中实例化.如何从该实例调用方法? 解决方法 使用PyObjC. 它包含在Leopard amp;
我正在开发一个 Python / ObjC应用程序,我需要在ObjC的Python类中调用一些方法.
我尝试了几件事没有成功.

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

解决方法

使用PyObjC.

它包含在Leopard& amp;后来.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读