Jean Coiron
Jean Coiron

Reputation: 632

Python3: How to create a dict of different objects of the same class?

I would like to create a dict, containing several objects of the same class. Each object must be independent. Something like:

#!/usr/bin/python3

class myReserve():

    myList = dict()

    def __init__(self, initName):
        self.myName = initName
        self.setList()

    def setList(self):
        if self.myName == "fruit":
            self.myList[0] = "Orange"
            self.myList[1] = "Lemon"
        elif self.myName == "vegetable":
            self.myList[0] = "Tomato"
            self.myList[1] = "Carrot"
        #If neither fruit nor vegetable
        #myList should be empty.


myStore = dict()
myStore[0] = myReserve("fruit")
myStore[1] = myReserve("vegetable")
myStore[2] = myReserve("spices")

print(myStore[0].myList)

This prints:

{0: 'Tomato', 1: 'Carrot'}

I thought it would print:

{0: 'Orange', 1: 'Lemon'}

I understood objects are passed by reference in Python.

dict1 = {"var": 128}
dict2 = dict1
dict2["var"] = 0
print(dict1["var"])

Will print:

0

By creating a class I want to create a structure for different objects. I don't understand the behaviour of the first code example. Is it possible to do something like this in a Python way?

Upvotes: 0

Views: 137

Answers (1)

aknuds1
aknuds1

Reputation: 68127

Your problem is that you're defining myList on the class level, so that it's shared by every instance of myReserve. Try defining it in myReserve.__init__ instead:

class myReserve():
    def __init__(self, initName):
        self.myList = dict()

Full code:

#!/usr/bin/python3

class myReserve():
    def __init__(self, initName):
        self.myList = dict()
        self.myName = initName
        self.setList()

    def setList(self):
        if self.myName == "fruit":
            self.myList[0] = "Orange"
            self.myList[1] = "Lemon"
        elif self.myName == "vegetable":
            self.myList[0] = "Tomato"
            self.myList[1] = "Carrot"
        #If neither fruit nor vegetable
        #myList should be empty.


myStore = dict()
myStore[0] = myReserve("fruit")
myStore[1] = myReserve("vegetable")
myStore[2] = myReserve("spices")

print(myStore[0].myList)

Upvotes: 1

Related Questions