Introspecting PyObjC¶
Introduction¶
The normal introspection facilities can be used to introspect Objective-C classes as well. This document describes some differences between Objective-C classes and normal Python classes that might cause confusion, as well as some additional introspection mechanisms.
Using dir()
¶
The dir()
function is used to check which attributes
are available on a class or instance, and can be used without
problem on Objective-C classes.
There is a significant difference between regular Python
classes and Objective-C classes w.r.t. class methods:
Objective-C class methods are methods defined on a meta
class, and do not use the classmethod()
decorator.
Because of this dir(NSObject)
only lists instance methods,
and not class methods, use dir(type(NSObject))
to list
the class methods of an Objective-C class.
Note
Class methods are methods on a meta class because Objective-C
classes can have class- and instance-methods with the same
name, for example +[NSObject description]
and
-[NSObject description]
.
Using pydoc
or help()
¶
Pydoc
, and the help()
function in the
interactive interpreter, can introspect Objective-C classes,
but might not give as much information as you’d like.
As with dir()
, class methods are not mentioned in the
documentation for a class, and it is not yet clear if it is
possible to teach pydoc
to list methods on the metaclass.
For python versions earlier than 3.4 the prototype of methods lists
...
instead of an actual argument list. That’s due to a
limitation in pydoc
w.r.t. functions implemented in C.
The documentation string does list a full prototype, and
information about arguments.
Function and method metadata¶
Objective-C methods and functions have an __metadata__
method
that can be used to retrieve the information that the bridge
has about a specific method or function.
The result of this function is a copy of a metadata dictionary.
Type attributes¶
The struct and opaque pointer types created by PyObjC have
a __typestr__
attribute. This attribute contains the Objective-C
type encoding for variables of this type.
Introspecting instance variables¶
The functions listInstanceVariables()
, getInstanceVariable()
and setInstanceVariable()
can be used to introspect, and
change, instance variables of arbitrary Objective-C objects,
irrespecitive of whether or not those variables are public.
This can be useful during debugging, or when exploring the internals of a framework implementation, but shouldn’t be used in production code: instance variables aren’t part of public API and could therefore change without notice between releases. Changing instance variables can break class invariants and might cause misbehavior (including hard crashes).