Как создать список объектов?

Как мне создать список объектов (экземпляров класса) в Python?

Или это результат плохой конструкции? Мне это нужно, потому что у меня есть разные объекты, и мне нужно обработать их на более позднем этапе, поэтому я просто добавлю их в список и вызову их позже.


person user225312    schedule 05.07.2010    source источник
comment
Вы имеете в виду список объектов типа ([type(x), ... ]) или экземпляров класса ([1, 2, 3])?   -  person Skurmedel    schedule 06.07.2010
comment
@Skurmedel: экземпляры класса. Я упомянул это специально в вопросе :)   -  person user225312    schedule 06.07.2010
comment
@Alfred: хе-хе, я просто нахожу экземпляры класса немного двусмысленными, но теперь я понимаю, что вы имеете в виду, через выбранный ответ: P   -  person Skurmedel    schedule 06.07.2010


Ответы (7)


Хранить список экземпляров объектов очень просто

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

my_objects = []

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

# later

for obj in my_objects:
    print obj.number
person yanjost    schedule 05.07.2010
comment
Когда вы передаете объект в первой строке, это фактический объект или просто число, обозначающее номер экземпляра этого объекта? Если бы я написал my_objects(1), я бы вызвал первый объект, но я не думаю, что передаваемая 1 является объектом. Это может быть полностью ортогональным образовательным целям исходного ответа, но это поможет мне в другой связанной теме, с которой я борюсь. Спасибо. - person Brad English; 04.08.2017
comment
Я надеялся, что для этого есть блестящий специальный синтаксис :( - person SIGSTACKFAULT; 20.03.2018
comment
@Brad English, что указывает на то, что MyClass наследует свойства object - person ChootsMagoots; 27.05.2018
comment
i в MyClass (i) относится к number в функции __init__ класса. - person ChootsMagoots; 27.05.2018

Вы можете создать список объектов в одну строку, используя генератор списка.

class MyClass(object): pass

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

print(objs)
person cryptoplex    schedule 07.02.2019
comment
Это действительно чистый синтаксис. - person Galaxy; 22.04.2020
comment
Небольшая деталь: objs = [MyClass(i) for i in range(10)] - person Brainless; 05.09.2020

В учебнике по Python обсуждается использование списков.

Хранение списка классов ничем не отличается от хранения любых других объектов.

def MyClass(object):
    pass

my_types = [str, int, float, MyClass]
person Chris B.    schedule 05.07.2010

В Python имя класса относится к экземпляру класса. Рассмотреть возможность:

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

lst = [A, B, C]

# instantiate second class
b_instance = lst[1]()
print b_instance
person A. Jesse Jiryu Davis    schedule 06.07.2010

У меня есть несколько хакерских ответов, которые, вероятно, будут ужасными... но на данный момент у меня очень мало опыта.

далеко:

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)

Взломать способ сделать это:

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)

Еще один более «умный» хак:

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)
person Art Hill    schedule 15.01.2018

если my_list — это список, в котором вы хотите хранить свои объекты, а my_object — это ваш объект, который вы хотите сохранить, используйте эту структуру:

my_list.append(my_object)
person Kooranifar    schedule 24.03.2016

Я думаю, что вы здесь используете структуру, содержащую экземпляры вашего класса. Я не знаю синтаксиса для именования структур в Python, но в Perl я мог бы создать структуру obj.id[x], где x — увеличивающееся целое число. Затем я мог бы просто вернуться к конкретному экземпляру класса, который мне нужен, численно сославшись на структуру. Это что-то в направлении того, что вы пытаетесь сделать?

person Oso    schedule 06.07.2010