[Tutor] SEC: UNCLASSIFIED:-Object Ancestry

Michael P. Reilly arcege@shore.net
Tue, 16 Nov 1999 22:10:03 -0500 (EST)


> Is there a nice way to determine which classes an object inherits from, short of
> putting
> in capability queries or using __init__ to add a reference to that class to an
> inherit_list
> variable?

Each instance has an "__class__" attribute which references its class
object, and each class has a "__bases__" attribute which is a tuple of
the inherited classes, if any.  There are also two standard, built-in
functions which can test for inheritance: isinstance() and
issubclass().

>>> class A:
...   pass
...
>>> class B(A):
...   pass
...
>>> a, b = A(), B()
>>> a.__class__
<class __main__.A at 80cbc70>
>>> a.__class__ is A
1
>>> A.__bases__
()
>>> b.__class__
<class __main__.B at 80c9d80>
>>> B.__bases__
(<class __main__.A at 80cbc70>,)
>>> B.__bases__[0] is A
1
>>> A in b.__class__.__bases__
1
>>> isinstance(a, A)
1
>>> isinstance(a, B)
0
>>> isinstance(b, B)
1
>>> isinstance(b, A)
1
>>> issubclass(B, A)
1
>>> issubclass(A, B)
0
>>>

The isinstance() function also works with types.

  -Arcege

-- 
------------------------------------------------------------------------
| Michael P. Reilly, Release Engineer | Email: arcege@shore.net        |
| Salem, Mass. USA  01970             |                                |
------------------------------------------------------------------------