On Mar 3, 9:37 am, MooMaster <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list