Of Functions, Objects, and Methods-I NEED HELP PLEASE

Larry Hudson orgnut at yahoo.com
Thu Jun 9 02:59:35 EDT 2011


On 06/08/2011 01:09 PM, Cathy James wrote:
> I am almost there, but I need a little help:
>
> I would like to
>
> a) print my dogs in the format  index. name: breed as follows:
>
> 0. Mimi:Poodle
> 1.Sunny: Beagle
> 2. Bunny: German Shepard
> I am getting
>
> (0, ('Mimi', 'Poodle')) . Mimi : Poodle instead-what have I done wrong?
>
> b) I would like to append to my list, but my line dogs.dogAppend() is
> giving a TypeError:
>
> for i in enumerate (self.dogAppend()):
> TypeError: 'list' object is not callable
>
> Any help?
>
> #MY CODE BELOW:
>
> import sys

Not needed in the class definition, move it to the "if __name__..." section.
Actually, it's not needed at all.  That part could be rewritten to avoid the need for sys.exit() 
entirely.

> class Dog():
>      def __init__(self, name, breed):
>          self.name = name
>          self.breed = breed
>
>      def dogAppend(self):
>          self.dogAppend = []
>          self.dogAppend.append((self.name,self.breed))
>          return self.dogAppend

1:  Think about what you're trying to do here...  You seem to want _each_ instance of Dog to 
hold the whole list.  Do you want Dog to be an individual Dog or do you  want it to be a list of 
Dogs?  You can't do both in a single class.
2:  This won't work to append to your list anyway... each time you call dogAppend() it will 
clear out any existing list and result in a list of one element, a tuple of (name, breed).  You 
can do exactly the same thing with a single line:  return [(self.name, self.breed)]

>      def display (self):
>          for i in enumerate (self.dogAppend()):
>              print (i,".",  self.name, ": " + self.breed)
>
Misusing enumerate.  Check the docs.
http://docs.python.org/py3k/library/functions.html?highlight=enumerate#enumerate
Besides that, there are easier ways to print the contents of a list.

> if __name__ == "__main__":
>      dogs = Dog(name=input (" Enter Dog Name: "), breed=input ("Enter
> Dog Breed: "))
>      while not dogs:
>          print("Goodbye!!")
>          sys.exit()
>      else:

else does not belong with while.

>          #dogs.dogAppend()
>          dogs.display()

Here's one possible replacement.  There are many other approaches as well.
(This leaves the individual dogs as a (name, breed) tuple.  It could be modified for other 
definitions of a dog. -- Exercise left for the reader...)    ;-)

class DogKennel:
     def __init__(self):
         self.dogs = []      #  list of dogs

     def addDog(self):
         name = input("Enter dog name:  ")
         if name == "":
             return False
         breed = input("Enter dog breed:  ")
         if breed == "":
             return False
         self.dogs.append((name, breed))   #  Append this dog tuple to the list
         return True

     def display(self):
         i = 1
         for dog in self.dogs:
             print("%d.  %s: %s" % (i, dog[0], dog[1]))
             i += 1;

if __name__ == "__main__":
     dogs = DogKennel()
     while (dogs.addDog()):
         pass
     dogs.display()

      -=- Larry -=-



More information about the Python-list mailing list