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).