Getting the super class via the super() function

Bob Willan bobhis at his.com
Fri Nov 21 19:08:55 EST 2003


On Fri, 21 Nov 2003 17:29:24 +0100, Fernando Rodriguez wrote:

> Hi,
> 
> I need to traverse the methods defined in a class and its superclasses.  This
> is the code I'm using:
> 
> # An instance of class B should be able to check all the methods defined in B
> #and A, while an instance of  class C should be able to check all methods
> #defined in C, B and A.
> 
<snip>
I think the code below shows how to do what you want.  It only prints the
inspect.classify_class_attrs() to show that if you really want to, you can
determine which methods are created by each class vs. inherited from a
super class - e.g. __init__() in C vs inherited in D, traverse() in A vs
inherited in B, C, D.

Bob

[bob at localhost]$ cat xx.py
import inspect

class A(object):

    def printobj(self):
        print '\ninside A class object'


    def traverse(self):
        classes = inspect.getmro(self.__class__)
        print classes
        # get rid of last class, the 'object' class
        classes = classes[:-1]
        print classes
        for c in classes:
            members = inspect.getmembers(c,inspect.ismethod)
            #do something
            c.printobj(self)
            print members
            print
            for a in inspect.classify_class_attrs(c):
                print a
        print '\n\n'

class B(A):
    bb = 0
    def printobj(self):
        print '\ninside B class object'

class C(B):
    aa = 0
    def __init__(self):
        self.c_only = 0

    def printobj(self):
        print '\ninside C class object'

class D(C):
    def printobj(self):
        print '\ninside D class object'

d = D()

d.traverse()

[bob at localhost]$ python xx.py
(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>)

inside D class object
[('__init__', <unbound method D.__init__>), ('printobj', <unbound method D.printobj>), ('traverse', <unbound method D.traverse>)]

('__class__', 'data', <type 'object'>, <attribute '__class__' of 'object' objects>)
('__delattr__', 'method', <type 'object'>, <slot wrapper '__delattr__' of 'object' objects>)
('__dict__', 'data', <class '__main__.A'>, <attribute '__dict__' of 'A' objects>)
('__doc__', 'data', <class '__main__.D'>, None)
('__getattribute__', 'method', <type 'object'>, <slot wrapper '__getattribute__' of 'object' objects>)
('__hash__', 'method', <type 'object'>, <slot wrapper '__hash__' of 'object' objects>)
('__init__', 'method', <class '__main__.C'>, <function __init__ at 0x80df154>)
('__module__', 'data', <class '__main__.D'>, '__main__')
('__new__', 'data', <type 'object'>, <built-in method __new__ of type object at 0x400d6a40>)
('__reduce__', 'method', <type 'object'>, <method '__reduce__' of 'object' objects>)
('__repr__', 'method', <type 'object'>, <slot wrapper '__repr__' of 'object' objects>)
('__setattr__', 'method', <type 'object'>, <slot wrapper '__setattr__' of 'object' objects>)
('__str__', 'method', <type 'object'>, <slot wrapper '__str__' of 'object' objects>)
('__weakref__', 'data', <class '__main__.A'>, <member '__weakref__' of 'A' objects>)
('aa', 'data', <class '__main__.C'>, 0)
('bb', 'data', <class '__main__.B'>, 0)
('printobj', 'method', <class '__main__.D'>, <function printobj at 0x80c6444>)
('traverse', 'method', <class '__main__.A'>, <function traverse at 0x8073e54>)

inside C class object
[('__init__', <unbound method C.__init__>), ('printobj', <unbound method C.printobj>), ('traverse', <unbound method C.traverse>)]

('__class__', 'data', <type 'object'>, <attribute '__class__' of 'object' objects>)
('__delattr__', 'method', <type 'object'>, <slot wrapper '__delattr__' of 'object' objects>)
('__dict__', 'data', <class '__main__.A'>, <attribute '__dict__' of 'A' objects>)
('__doc__', 'data', <class '__main__.C'>, None)
('__getattribute__', 'method', <type 'object'>, <slot wrapper '__getattribute__' of 'object' objects>)
('__hash__', 'method', <type 'object'>, <slot wrapper '__hash__' of 'object' objects>)
('__init__', 'method', <class '__main__.C'>, <function __init__ at 0x80df154>)
('__module__', 'data', <class '__main__.C'>, '__main__')
('__new__', 'data', <type 'object'>, <built-in method __new__ of type object at 0x400d6a40>)
('__reduce__', 'method', <type 'object'>, <method '__reduce__' of 'object' objects>)
('__repr__', 'method', <type 'object'>, <slot wrapper '__repr__' of 'object' objects>)
('__setattr__', 'method', <type 'object'>, <slot wrapper '__setattr__' of 'object' objects>)
('__str__', 'method', <type 'object'>, <slot wrapper '__str__' of 'object' objects>)
('__weakref__', 'data', <class '__main__.A'>, <member '__weakref__' of 'A' objects>)
('aa', 'data', <class '__main__.C'>, 0)
('bb', 'data', <class '__main__.B'>, 0)
('printobj', 'method', <class '__main__.C'>, <function printobj at 0x80df18c>)
('traverse', 'method', <class '__main__.A'>, <function traverse at 0x8073e54>)

inside B class object
[('printobj', <unbound method B.printobj>), ('traverse', <unbound method B.traverse>)]

('__class__', 'data', <type 'object'>, <attribute '__class__' of 'object' objects>)
('__delattr__', 'method', <type 'object'>, <slot wrapper '__delattr__' of 'object' objects>)
('__dict__', 'data', <class '__main__.A'>, <attribute '__dict__' of 'A' objects>)
('__doc__', 'data', <class '__main__.B'>, None)
('__getattribute__', 'method', <type 'object'>, <slot wrapper '__getattribute__' of 'object' objects>)
('__hash__', 'method', <type 'object'>, <slot wrapper '__hash__' of 'object' objects>)
('__init__', 'method', <type 'object'>, <slot wrapper '__init__' of 'object' objects>)
('__module__', 'data', <class '__main__.B'>, '__main__')
('__new__', 'data', <type 'object'>, <built-in method __new__ of type object at 0x400d6a40>)
('__reduce__', 'method', <type 'object'>, <method '__reduce__' of 'object' objects>)
('__repr__', 'method', <type 'object'>, <slot wrapper '__repr__' of 'object' objects>)
('__setattr__', 'method', <type 'object'>, <slot wrapper '__setattr__' of 'object' objects>)
('__str__', 'method', <type 'object'>, <slot wrapper '__str__' of 'object' objects>)
('__weakref__', 'data', <class '__main__.A'>, <member '__weakref__' of 'A' objects>)
('bb', 'data', <class '__main__.B'>, 0)
('printobj', 'method', <class '__main__.B'>, <function printobj at 0x80df11c>)
('traverse', 'method', <class '__main__.A'>, <function traverse at 0x8073e54>)

inside A class object
[('printobj', <unbound method A.printobj>), ('traverse', <unbound method A.traverse>)]

('__class__', 'data', <type 'object'>, <attribute '__class__' of 'object' objects>)
('__delattr__', 'method', <type 'object'>, <slot wrapper '__delattr__' of 'object' objects>)
('__dict__', 'data', <class '__main__.A'>, <attribute '__dict__' of 'A' objects>)
('__doc__', 'data', <class '__main__.A'>, None)
('__getattribute__', 'method', <type 'object'>, <slot wrapper '__getattribute__' of 'object' objects>)
('__hash__', 'method', <type 'object'>, <slot wrapper '__hash__' of 'object' objects>)
('__init__', 'method', <type 'object'>, <slot wrapper '__init__' of 'object' objects>)
('__module__', 'data', <class '__main__.A'>, '__main__')
('__new__', 'data', <type 'object'>, <built-in method __new__ of type object at 0x400d6a40>)
('__reduce__', 'method', <type 'object'>, <method '__reduce__' of 'object' objects>)
('__repr__', 'method', <type 'object'>, <slot wrapper '__repr__' of 'object' objects>)
('__setattr__', 'method', <type 'object'>, <slot wrapper '__setattr__' of 'object' objects>)
('__str__', 'method', <type 'object'>, <slot wrapper '__str__' of 'object' objects>)
('__weakref__', 'data', <class '__main__.A'>, <member '__weakref__' of 'A' objects>)
('printobj', 'method', <class '__main__.A'>, <function printobj at 0x8073e1c>)
('traverse', 'method', <class '__main__.A'>, <function traverse at 0x8073e54>)





More information about the Python-list mailing list