Re: [Pyobjc-dev] Catergory Question ...
Brought to you by:
ronaldoussoren
From: Ronald O. <ron...@ma...> - 2009-05-10 17:15:27
|
On 10 May, 2009, at 19:06, Mic Pringle wrote: > Ronald, > > So is there no way at all the be able to call a Python pyobj-c class > from Obj-C as from your earlier response you did imply this ?? > > '...the same is true for methods you add in a subclass, those can be > called from ObjC as well...' You can call methods on a class that's defined in Python. You cannot have direct references to a class that's defined in Python though. That is: BKTextile* object = [BKTextile new]; // This get's you a link-time error BKTextile* object = [NSClassFromString(@"BKTextile") new] // This should work > > I'm mainly a Obj-C programmer, and have only recently turned to > PyObj-c as a way to utilise many libraries that simply aren't > available to Obj-C, such as for processing Textile and Yaml ? > > I have got it working so far using another method I found on the > internet which involves creating a wrapper class for the Python part > and using NSClassFromString to instantiate the class, but I was hoping > to drop these two extra files in favour of just using a header file > and the original Python file like with the category stuff. Is this > then not possible ? AFAIK the only limitation is that you cannot have [APythonClass classmethod] in your code, you must use NSClassFromString to access the class object. This is purely for technical limitations, the ObjC compiler needs link-time access to the class when you call a classmethod, and that's impossible to arrange for using PyObjC. Ronald > > Thank > > -Mic > > > 2009/5/10 Ronald Oussoren <ron...@ma...>: >> Mic, >> >> You cannot refer to the class directly in Objective-C, that's >> because PyObjC >> will create the class at runtime and your ObjC code tries to link >> to it at >> compile-time. >> >> I tend to write all my code in Python, using ObjC as a way to >> optimize code >> where needed and to access API's that are not available in Python. >> This >> means I tend to be able to get away with creating instances in >> Python code, >> while still calling methods on them in ObjC. >> >> Ronald >> >> On 10 May, 2009, at 18:26, Mic Pringle wrote: >> >>> Hi Ronald, >>> >>> As you have probably seen, I now have categories working fine, >>> thanks >>> to your help. >>> >>> You mentioned in one of your earlier replies that I can also do the >>> same for subclasses, not just categories. So following this I have >>> created a header file in Objective-C with the following contents ... >>> >>> #import <Cocoa/Cocoa.h> >>> >>> @interface BKTextile : NSObject >>> >>> - (NSString *)decodeTextile:(NSString *)aString; >>> >>> @end >>> >>> And then created the following Python implementation ... >>> >>> from Foundation import * >>> import textile >>> >>> class BKTextile(NSObject): >>> >>> def decodeTextile_(self, aString): >>> return u"it worked!" >>> >>> Which is pretty much what I've done to get the category to work, >>> except when I try to compile I get the following error ... >>> >>> .objc_class_name_BKTextile referenced from: >>> literal-pointer@_OBJC@__cls_refs@BKTextile in PythonServerTest.o >>> symbol(s) not found >>> >>> Any ideas ?? >>> >>> Thanks, >>> >>> Mic >>> >>> >>> 2009/5/8 Ronald Oussoren <ron...@ma...>: >>>> >>>> On Friday, May 08, 2009, at 10:59AM, "Mic Pringle" <mic...@gm... >>>> > >>>> wrote: >>>>> >>>>> Hi, >>>>> >>>>> Just a quick question regarding categories. >>>>> >>>>> I have a hybrid Obj-c/PyObj-c application and I'd like to know >>>>> if I >>>>> add a category in a PyObj-c module, will it be availble to use >>>>> in the >>>>> Obj-c side of the project ?? >>>>> >>>>> If so, does it just work or are there any special instructions I >>>>> need >>>>> to follow to get it working ? >>>> >>>> Methods you add using an Python category are available in ObjC as >>>> well >>>> (the same is true for methods you add in a subclass, those can be >>>> called >>>> from ObjC as well). >>>> >>>> Two possible sources for confusion/problems: >>>> >>>> * Unless the methods you add are already known to the compiler >>>> you'll >>>> have to write a header file that the ObjC compiler >>>> can use. You'll get compiler warnings otherwise. >>>> >>>> * Methods that you add in python by default have arguments and a >>>> return >>>> value of type 'id'. This can be overridden by: >>>> >>>> - information extracted from the superclass (if you override a >>>> method >>>> PyObjC knows the new method should have the >>>> same signature as the one in a superclass). >>>> - the method is defined in an informal_protocol that's known to >>>> PyObjC, >>>> the method signature is then extracted from >>>> that protocol >>>> - manual annotations (objc.accessor, objc.selector, ....) >>>> >>>> Ronald >>>>> >>>>> Thanks >>>>> >>>>> -Mic >>>>> >>>>> >>>>> ------------------------------------------------------------------------------ >>>>> The NEW KODAK i700 Series Scanners deliver under ANY >>>>> circumstances! Your >>>>> production scanning environment may not be a perfect world - but >>>>> thanks >>>>> to >>>>> Kodak, there's a perfect scanner to get the job done! With the >>>>> NEW KODAK >>>>> i700 >>>>> Series Scanner you'll get full speed at 300 dpi even with all >>>>> image >>>>> processing features enabled. http://p.sf.net/sfu/kodak-com >>>>> _______________________________________________ >>>>> Pyobjc-dev mailing list >>>>> Pyo...@li... >>>>> https://lists.sourceforge.net/lists/listinfo/pyobjc-dev >>>>> >>>>> >>>> >> >> |