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.
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
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.
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
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.
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
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
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.
The struct and opaque pointer types created by PyObjC have
__typestr__ attribute. This attribute contains the Objective-C
type encoding for variables of this type.
Introspecting instance variables¶
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).