Getting the super class via the super() function

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Fernando Rodriguez

    Getting the super class via the super() function

    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.

    #------------------------------------------------
    class A(object):

    def hasSuper(self,c ls):
    if len(cls.mro()) > 1:
    return 1
    else:
    return None


    def traverse(self):
    while self.hasSuper(s elf.__class__):
    #do something
    print 'Did something to a %s'%self
    self = super(self.__cl ass__, self)

    class B(A):
    pass

    class C(B):
    pass

    c = C()

    c.traverse()
    #-----------------------------------------------

    I get this error:
    while self.hasSuper(s elf.__class__):
    AttributeError: 'super' object has no attribute 'hasSuper'

    What am I doing wrong? I'm afraid that super isn't returning a reference to
    the superclass... :-?
  • Michael Hudson

    #2
    Re: Getting the super class via the super() function

    Fernando Rodriguez <frr@easyjob.ne t> writes:
    [color=blue]
    > Hi,
    >
    > I need to traverse the methods defined in a class and its superclasses. This
    > is the code I'm using:[/color]
    [...]
    [color=blue]
    > What am I doing wrong? I'm afraid that super isn't returning a
    > reference to the superclass... :-?[/color]

    That's right, it's not. Python supports multiple inheritance -- what
    is *the* superclass?

    For new-style classes you're probably best off just looking through
    cls.__mro__.

    Cheers,
    mwh

    --
    That's why the smartest companies use Common Lisp, but lie about it
    so all their competitors think Lisp is slow and C++ is fast. (This
    rumor has, however, gotten a little out of hand. :)
    -- Erik Naggum, comp.lang.lisp

    Comment

    • Bob Willan

      #3
      Re: Getting the super class via the super() function

      On Fri, 21 Nov 2003 17:29:24 +0100, Fernando Rodriguez wrote:
      [color=blue]
      > 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.
      >[/color]
      <snip>
      I think the code below shows how to do what you want. It only prints the
      inspect.classif y_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@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.getmemb ers(c,inspect.i smethod)
      #do something
      c.printobj(self )
      print members
      print
      for a in inspect.classif y_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@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)
      ('__getattribut e__', '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)
      ('__getattribut e__', '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)
      ('__getattribut e__', '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)
      ('__getattribut e__', '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>)

      Comment

      Working...