[Tutor] Deleting an instance of an object

Kent Johnson kent_johnson at skillsoft.com
Thu Sep 23 14:17:08 CEST 2004


Adam,

First, I'll try to shed a little light on some misconceptions you seem to have.

The name that you have stored in the collect_results list is not really 
associated with the Article any more, it is just a reference to a string. 
That is why you get the error 'str' object has no attribute '__del__'.

You shouldn't be calling __del__ yourself. __del__ is an internal method 
that implements the del statement.

Objects are deleted from a container by calling del on the container. In 
other words, you don't ask an object to delete itself from a container, you 
ask the container to delete the object.

OK, so how should you accomplish what you want? There are two ways to 
delete from a list, by index and by reference (see 
http://docs.python.org/lib/typesseq-mutable.html). For example, here is a 
simple Article class that has a name and shows the name when printed:

 >>> class Article:
...   def __init__(self, name):
...     self.name = name
...   def __repr__(self):
...     return self.name
...

Make a few articles and put them in a list:

 >>> a=Article('Learning Python')
 >>> a
Learning Python
 >>> b=Article('Python Networking')
 >>> c=Article('Using Twisted')
 >>> articles = [a, b, c]
 >>> articles
[Learning Python, Python Networking, Using Twisted]

Delete the first article by index:

 >>> del articles[0]
 >>> articles
[Python Networking, Using Twisted]

Delete article b by reference:

 >>> articles.remove(b)
 >>> articles
[Using Twisted]

Notice that in each case I do something with the list, and in each case I 
need to know something about the article object besides its name - either 
its index in the list, or a reference to the actual article object.

So, what does this mean for you? I suggest that you save more information 
about an article in the collect_results list. You could save the 
articlesheld list, and the article object. You don't need the name as it is 
in the article. A simple way to do this is to store a tuple in the list :
   result = (issue_object.articlesheld, article_object)
   collect_results.append(result)

To print the list, you need to unpack the tuple and get the article name back:
   for article_list, article in collect_results:
     print article.name

(You can read a little more about tuples here: 
http://docs.python.org/tut/node7.html#SECTION007300000000000000000)

To delete an entry, get the list and article from the entry and remove the 
article from the list:
   article_list, article = collect_results[del_choice_int]
   article_list.remove(article)

Kent


At 10:19 AM 9/23/2004 +0100, Adam Cripps wrote:
>I've designed an OOP program, where I keep a catalogue of
>publications. I want to be able to delete an instance of Article
>(Article is a subclass of Issue, which is a subclass of Title, which
>is a subclass of MagazineCollection). Each instance of Article has an
>attribute name (article.name).
>
>I've created a loop which searches through the article.name(s) and
>found the one I want. The user has specified which one they want to
>delete and I've collected that.
>
>The problem I'm having is finding out the instantiation of self.name -
>is there a hard and fast way of identifying a particular instance of
>self.name?
>
>I'm getting the error:
>AttributeError: 'str' object has no attribute '__del__'
>Deleted
>
>which is strange, as the Deleted is coming from a __del__ function
>that I placed in the Article class.
>
>--
>proj: http://jiletters.sf.net
>site: http://www.monkeez.org
>wiki: http://wiki.monkeez.org
>_______________________________________________
>Tutor maillist  -  Tutor at python.org
>http://mail.python.org/mailman/listinfo/tutor



More information about the Tutor mailing list