Instantiating Objective-C objects¶
Changed in version 10.4: The Pythonic interface for instantiation classes was added.
Objective-C uses a two step object instantatin
process, similar to Python’s __new__
and
__init__
methods, but with explicit invocation
of the methods alloc
and init
. By default
this is mirrored in the Python proxies:
some_value = NSObject.alloc().init()
some_button = NSButton.alloc().initWithFrame_(some_frame)
This looks very foreign in Python, therefore PyObjC also supports a condensed version of this by directly calling the class:
.. sourcecode:: python
some_value = NSObject()
some_button = NSButton(frame=some_frame)
The generic rules for instantiation objects through calling the class are:
Calling the class without arguments in supported unless the
init
method has been marked withNS_UNAVAILABLE
in Apple’s SDK.Every instance selector of the Objective-C with a name starting with
init
adds a possible set of keyword arguments using the following algorithm:Strip
initWith
orinit
from the start of the selector;Lowercase the first character of the result
All segments are now keyword only arguments, in that order.
For example given,
-[SomeClass initWithX:y:z]
the following invocation is valid:SomeClass(x=1, y=2, z=3)
. Using the keywords in a different order is not valid.Some classes may have additional sets of keyword arguments, whose will be documented in the framework notes. In general those will be based on factory class methods for which there are no equivalent using the
alloc().init...(...)
pattern.
For classes in system frameworks the possibly init method are registered using frmaework data.
For classes implemented in Python the possible init methods
are detected automatically, just implement one or more Objective-C
style init methods to add sets of keyword arguments for __new__
(and don’t implement __new__
or __init__
in the Python
class).
Set init
to None
to require using one or more keyword
arguments, that is:
class MyObject(NSObject):
init = None # Calling MyOjbect() is not allowed
def initWithX_y_(self, x_value, y_value):
self = super.init()
self.x = x_value
self.y = y_value
return self
value = MyValue(x=42, y=24)