using exec() to instantiate a new object.

RyanN Ryan.Neve at gmail.com
Mon Nov 10 10:37:12 EST 2008


On Nov 10, 7:47 am, RyanN wrote:
> Thank you both, I knew there had to be a good way of doing this.
>
> -Ryan

Just an update. I used dictionaries to hold objects and their names.
I'm beginning to understand better. Now to apply this to my actual
problem. Here's the code I ended up with:

class continent(object):
    '''
    A continent has a name and a dictionary of countries
    '''
    def __init__(self,continent_name):
        self.name = continent_name
        self.countries = {} #countries is a dictionary of country name
and object
    def addCountry(self,country_name,population = 0):
        self.countries[country_name] = country(country_name) #Create a
new instance of country() and add it to dictionary
        self.countries[country_name].population = population #Set
country population
    def addState(self,country_name,state_name,population = 0):
        if country_name in self.countries:
 
self.countries[country_name].addState(state_name,population)
        else: #This state must be in a new country
            self.addCountry(country_name)
            self.addState(country_name,state_name,population)
    def listCountries(self):
        for a_country in self.countries:
            print a_country,
"pop:",self.countries[a_country].population,", states:"
            self.countries[a_country].listStates()

class country(object):
    '''
    A country has a name, a population and a dictionary of states
    '''
    def __init__(self,name):
        self.name = name
        self.population = 0
        self.states = {} #states is a dictionary of state name and
object
    def addState(self,state_name,population = 0):
        self.states[state_name] = state(state_name) #Create a new
instance of state() and add it to dictionary
        self.states[state_name].population = population
        self.population += population  #Add this state's population to
the country's

    def listStates(self):
        #print self.states[:]
        for a_state in self.states:
            self.states[a_state].stateInfo()

class state(object):
    '''
    A state has a name, color, and a population
    '''
    def __init__(self,state_name):
        self.name = state_name
        self.color = 'unknown'
        self.population = 0
    def stateInfo(self):
        print "   ",self.name,"pop:",self.population,
"color:",self.color

#Now some examples of how to set and access this information
NAm = continent('NAm')   #First we add our continent
NAm.addCountry('canada',700) #Now add a a country to NAm
NAm.addState('usa','maine',400) #We can add a state even if we haven't
added the country yet
NAm.addState('usa','california',2000)
NAm.addState('canada','quebec',700) # I know it's actually a province
NAm.addState('mexico','QR',550)
usa = NAm.countries['usa']  # we can make things easier on ourselves
usa.population = 5000 #short for: NAm.countries['usa'].population =
5000
usa.addState('florida') #Another way to add a state, we can set
population seperately
NAm.countries['usa'].states['florida'].population = 2000
for any_state in usa.states: #Set an attribute for all state objects
    usa.states[any_state].color = 'blue'
NAm.listCountries() # Generates a report
# three ways to get to print the same information
print NAm.countries['usa'].states['maine'].name,
NAm.countries['usa'].states['maine'].population
print usa.states['maine'].name, usa.states['maine'].population # We
already assigned usa to NAm.countries['usa']
maine = usa.states['maine']
print maine.name, maine.population



More information about the Python-list mailing list