Inheritance issue...

Matimus mccredie at gmail.com
Mon Mar 3 19:47:09 CET 2008


On Mar 3, 9:37 am, MooMaster <ntv1... at gmail.com> wrote:
> I'm trying to use inheritance to create a simple binary tree, but it's
> not going so well... here's what I pull from the documentation for
> super()
> "super( type[, object-or-type])
>
> Return the superclass of type. If the second argument is omitted the
> super object returned is unbound. If the second argument is an object,
> isinstance(obj, type) must be true. If the second argument is a type,
> issubclass(type2, type) must be true. super() only works for new-style
> classes.
> A typical use for calling a cooperative superclass method is:
>
> class C(B):
>     def meth(self, arg):
>         super(C, self).meth(arg)
> "
>
> So here's what I do:
>
> class Node:
>     def __init__(self, val=0, prnt = None):
>         self.value = val
>         self.parent = prnt
>
> class Tree(Node):
>     def __init__(self, val=0):
>         self.root = super(Tree, self).__init__(val)
>         self.leftChild = None
>         self.rightChild = None
>
>     def addChild(self, value):
>         if self.root == None:
>             self.__init__(value)
>         else:
>             n = self.root
>             while(n is not None):
>                 if(n.leftChild == None and n.rightChild == None):
>                     n.leftChild = Node(value, n)
>                 elif(n.rightChild == None):
>                     n.rightChild = Node(value, n)
>                 else:
>                     if(n.leftChild.leftChild is not None and
> n.leftChild.rightChild is not None):
>                         n = n.rightChild
>                     else:
>                         n = n.leftChild
>
>     def printTree(self):
>         if self.root == None:
>             print "None"
>         else:
>             n = self.root
>             print n.value
>             while(n is not None):
>                 if(n.leftChild is None):
>                     print str(n.value) + "'s left child is None"
>                 elif(n.rightChild is None):
>                     print str(n.value) + "'s right child is None"
>                 else:
>                     if(n.leftChild.leftChild is not None and
> n.leftChild.rightChild is not None):
>                         n = n.rightChild
>                     else:
>                         n = n.leftChild
> def main():
>     play = Tree(1)
>     play.addChild(2)
>     play.addChild(3)
>     play.addChild(4)
>     play.addChild(5)
>     play.printTree()
>
> if __name__ == "__main__":
>     main()
>
> ...and here's what I get:
>
> Traceback (most recent call last):
>   File "C:/Users/The_N_Channel/Desktop/funWithTrees.py", line 53, in
> <module>
>     main()
>   File "C:/Users/The_N_Channel/Desktop/funWithTrees.py", line 45, in
> main
>     play = Tree(1)
>   File "C:/Users/The_N_Channel/Desktop/funWithTrees.py", line 8, in
> __init__
>     self.root = super(Tree, self).__init__(val)
> TypeError: super() argument 1 must be type, not classobj
>
> Looks to me like the super(Tree, self)__init__(val) follows the
> example in the documentation, but I may be a witch. Anyone know why
> this doesn't work?


Node should inherit from `object'. Unless you inherit from object you
are using old-style classes, which do not derive from type and cannot
use the super method.

Example:
class Node(object):

Also, __init__ does not return anything, ever. This doesn't make
sense:
>         self.root = super(Tree, self).__init__(val)

When you call the __init__ method of a base class, it will operate on
self.

Example:

>>> class CBase(object):
...     def __init__(self, a):
...         self.a = a
...
>>> class C(CBase):
...     def __init__(self, a, b):
...         super(C, self).__init__(a)
...         self.b = b
...
>>> c = C(1,2)
>>> c.a
1
>>> c.b
2

Doing things like self.__init__(val) doesn't make sense.

Matt



More information about the Python-list mailing list