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