51

How do I go about creating a list of objects (class instances) in Python?

Or is this a result of bad design? I need this cause I have different objects and I need to handle them at a later stage, so I would just keep on adding them to a list and call them later.

martineau
  • 119,623
  • 25
  • 170
  • 301
user225312
  • 126,773
  • 69
  • 172
  • 181

8 Answers8

94

Storing a list of object instances is very simple

class MyClass(object):
    def __init__(self, number):
        self.number = number

my_objects = []

for i in range(100):
    my_objects.append(MyClass(i))

# Print the number attribute of each instance

for obj in my_objects:
    print(obj.number)
ho-l
  • 3
  • 3
yanjost
  • 5,223
  • 2
  • 25
  • 28
  • Where you pass "object" in the first line, is that an actual object or just a number signifying that object instance's number? If I were to write my_objects(1), I would call to the first object, but I don't think the 1 being passed in is an object. This might be entirely orthogonal to the educational purposes of the original response, but it would help me on a different, related topic I'm struggling with. Thanks. – Brad English Aug 04 '17 at 16:31
  • 2
    T'was hoping there was a shiny special syntax for this :( – SIGSTACKFAULT Mar 20 '18 at 12:53
  • @Brad English, that indicates that `MyClass` inherits the properties of an `object` – ChootsMagoots May 26 '18 at 23:10
  • 1
    The `i` in `MyClass (i)` refers to the `number` in the class's `__init__` function. – ChootsMagoots May 26 '18 at 23:17
26

You can create a list of objects in one line using a list comprehension.

class MyClass(object): pass

objs = [MyClass() for i in range(10)]

print(objs)
cryptoplex
  • 1,235
  • 10
  • 14
5

The Python Tutorial discusses how to use lists.

Storing a list of classes is no different than storing any other objects.

def MyClass(object):
    pass

my_types = [str, int, float, MyClass]
Chris B.
  • 85,731
  • 25
  • 98
  • 139
4

In Python, the name of the class refers to the class instance. Consider:

class A: pass
class B: pass
class C: pass

lst = [A, B, C]

# instantiate second class
b_instance = lst[1]()
print b_instance
2

I have some hacky answers that are likely to be terrible... but I have very little experience at this point.

a way:

class myClass():
    myInstances = []
    def __init__(self, myStr01, myStr02):
        self.myStr01 = myStr01
        self.myStr02 = myStr02
        self.__class__.myInstances.append(self)

myObj01 = myClass("Foo", "Bar")
myObj02 = myClass("FooBar",  "Baz")

for thisObj in myClass.myInstances:
    print(thisObj.myStr01)
    print(thisObj.myStr02)

A hack way to get this done:

import sys
class myClass():
    def __init__(self, myStr01, myStr02):
        self.myStr01 = myStr01
        self.myStr02 = myStr02

myObj01 = myClass("Foo", "Bar")
myObj02 = myClass("FooBar",  "Baz")

myInstances = []
myLocals = str(locals()).split("'")
thisStep = 0
for thisLocalsLine in myLocals:
    thisStep += 1
    if "myClass object at" in thisLocalsLine:
        print(thisLocalsLine)
        print(myLocals[(thisStep - 2)])
        #myInstances.append(myLocals[(thisStep - 2)])
        print(myInstances)
        myInstances.append(getattr(sys.modules[__name__], myLocals[(thisStep - 2)]))

for thisObj in myInstances:
    print(thisObj.myStr01)
    print(thisObj.myStr02)

Another more 'clever' hack:

import sys
class myClass():
    def __init__(self, myStr01, myStr02):
        self.myStr01 = myStr01
        self.myStr02 = myStr02

myInstances = []
myClasses = {
    "myObj01": ["Foo", "Bar"],
    "myObj02": ["FooBar",  "Baz"]
    }

for thisClass in myClasses.keys():
    exec("%s = myClass('%s', '%s')" % (thisClass, myClasses[thisClass][0], myClasses[thisClass][1]))
    myInstances.append(getattr(sys.modules[__name__], thisClass))

for thisObj in myInstances:
    print(thisObj.myStr01)
    print(thisObj.myStr02)
Art Hill
  • 46
  • 5
1

we have class for students and we want make list of students that each item of list is kind of student

class student :
    def __init__(self,name,major):
        self.name=name
        self.major=major


students = []
count=int(input("enter number of students :"))
#Quantify
for i in range (0,count):
    n=input("please enter name :")
    m=input("please enter major :")
    students.append(student(n,m))
#access
for i in students:
    print (i.name,i.major)
Rezee.em
  • 11
  • 1
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Jun 26 '22 at 16:44
0

if my_list is the list that you want to store your objects in it and my_object is your object wanted to be stored, use this structure:

my_list.append(my_object)
-2

I think what you're of doing here is using a structure containing your class instances. I don't know the syntax for naming structures in python, but in perl I could create a structure obj.id[x] where x is an incremented integer. Then, I could just refer back to the specific class instance I needed by referencing the struct numerically. Is this anything in the direction of what you're trying to do?

Andy
  • 3,132
  • 4
  • 36
  • 68