[Tutor] Use iterator to refer to an object's attribute?

Alan Gauld alan.gauld at freenet.co.uk
Thu Apr 20 17:31:04 CEST 2006


> Dictionaries are only pairs of data.  I assume a list can be one of 
> those elements, but I couldn't figure out how to make it work in the 
> structure I presented.

Yes, the object that is stored can be anything. Thus

>>> numList = [1,2,3]
>>> chrList = ['1','2','3']
>>> numDict = {}
>>> numDict['asNum'] = numList
>>> numDict['asChr'] = chrList
>>> for item in numDict['asNum']: print item,
...
1 2 3
>>>

shows two lists being stored in a dictionary.
You can also store instances of classes or functions 
or even the classes themselves!

> I wanted to make the methods flexible enough that I wouldn't have to 
> edit every method if the module list ever changed.  I guess I don't 
> understand how a dictionary works in this situation.

I don;t understand what you don;t understand here. Can you 
expand on why you don't think a dictionary would work?

>> Why not write constructors that take a list as a parameter.
>> The constructor can manage its own list and the higher
>> level constructor just passes in the appropriate list. That way
>> each class only needs to know about the data at the level
>> it is responsible for. So the Module class might look a bit like:
>>
>> class Module:
>>    def __init__(self, name, componentlist):
>>         self.components = {}
>>         self.name = name
>>         for component in componentlist:
>>             self.components[component[0]] = Component(component)
>>
>> This implies that the component list is structured as a list of tuples.
> 
> I originally had tuples, but you can't access individual elements.  

What makes you think so?

>>> t = (1,2,3)
>>> print t[0]
1
>>>

The only thing you can't do is alter the data in the tuple - which is 
exactly the behaviour you want if reading the tuple from a config file!

>>> I have object "db.mb".  I have iterator "shortmod" with a value of  
>>> "mb". Why can't I call "db.shortmod"?
>>
>> You can use db.getattr(shortmod)
> 
> That doesn't work.  It tells me "Database instance has no attribute 
> 'getattr'".

Its actually a special method so needs the underscores __getattr__
and accessed via a function. I got my syntax muddled:

getattr(db, shortmod)

is how it should be written.

>> but I think its easier and clearer in this case to use:
>>
>> db.Modules[shortmod]
> 
> If Modules is a class name, how am I able to call it like that?  

Modules is a dictionary of Modules in the db object. I 
should probably have used the example from my Module 
class above:

myModule.components[compname]

> "AttributeError: Database instance has no attribute 'Modules'"

You will need to modify the definition of the database class 
to have the Modules dictionary first! :-)

Alan G
Author of the learn to program web tutor
http://www.freenetpages.co.uk/hp/alan.gauld




More information about the Tutor mailing list