- How to create a list of objects?
- 8 Answers 8
- Получение списка экземпляров класса
- 3 ответа 3
- Как просто получить имя класса в Python
- Способ 1: комбинация __class__ и __name__
- Способ 2: использование функции type() с __name__
- Часто задаваемые вопросы
- Что такое класс в Python?
- Как получить имя класса в Python?
- Есть ли другой способ получить имя класса в Python?
- Как получить имя класса объекта в виде строки в Python?
- Как вызвать класс зная его имя?
- 3 ответа 3
How to create a list of objects?
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.
@Alfred: hehe, I just find class instances a bit ambiguous, but I see what you mean now through the selected answer 😛
8 Answers 8
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)
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.
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)
@Brainless, in this answer, the MyClass() initializer does not take an argument (in one of the other answers, it does. ).
The usual python idiom is to use _ for loop variables that aren’t referenced in the loop body (i.e. objs = [MyClass() for _ in range(10)] )
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]
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
I have some hacky answers that are likely to be terrible. but I have very little experience at this point.
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)
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)
Получение списка экземпляров класса
Что вы понимаете под фразой объект класса? В смысле свойство экземпляра класса? Они не упорядочены, у них нет индекса. Можно только по называнию свойства.
Я бы хотел вывести например, вот это: «Лил», «1», «Нет» (если индекс 0)В списке находятся элементы my_goom1.
3 ответа 3
Через @classmethod нет возможности переопределить метод __getitem__ класса. При попытке обращения через квадратный скобки будет возникать ошибка TypeError: ‘type’ object is not subscriptable .
Нерабочий пример:
class Goom(object): items = [] def __init__(self, name, seats, jump): """Инициализация""" self.name = name self.seats = seats self.jump = jump Goom.items.append(self) def __str__(self): return "<> <> <>".format(self.name, self.seats, self.jump) @classmethod def __getitem__(cls, index): return cls.item[index] my_goom1 = Goom("Лил", "1", "Нет") my_goom2 = Goom("Мак", "1", "Есть") my_goom3 = Goom("Ной", "1", "Есть") print(Goom[0]) # Traceback (most recent call last): # File "./prog.py", line 24, in # TypeError: 'type' object is not subscriptable
Как вариант, можно обращаться через само поле со списком объектов:
class Goom(object): items = [] def __init__(self, name, seats, jump): """Инициализация""" self.name = name self.seats = seats self.jump = jump Goom.items.append(self) def __str__(self): return "<> <> <>".format(self.name, self.seats, self.jump) my_goom1 = Goom("Лил", "1", "Нет") my_goom2 = Goom("Мак", "1", "Есть") my_goom3 = Goom("Ной", "1", "Есть") print(Goom.items[0])
Как просто получить имя класса в Python
Чтобы получить имя класса экземпляра в Python, вы можете использовать 2 следующих способа.
- используйте комбинацию __class__ и __name__
- используйте функцию type() в сочетании с __name__.
Способ 1: комбинация __class__ и __name__
В Python вы можете получить имя класса из экземпляра или самого класса, используя атрибут __class__ вместе с атрибутом __name__.
В этом примере мы определяем MainClass и создаем экземпляр с именем my_instance.
Чтобы получить имя класса из экземпляра, мы обращаемся к атрибуту __class__ экземпляра, за которым следует атрибут __name__ класса.
В качестве альтернативы мы можем получить имя класса непосредственно из класса, обратившись к его атрибуту __name__. Оба метода предоставляют имя класса в виде строки.
Способ 2: использование функции type() с __name__
Вы также можете использовать функцию type() и атрибут __name__, чтобы получить имя класса экземпляра в Python.
В этом примере мы определяем MainClass и создаем экземпляр с именем my_instance.
Чтобы получить имя класса из экземпляра, мы использовали функцию type(), которая возвращает класс экземпляра, а затем обратились к атрибуту __name__, чтобы получить имя класса в виде строки.
Часто задаваемые вопросы
Что такое класс в Python?
Класс в Python — это план для создания объектов. Он определяет набор общих атрибутов и методов для всех объектов этого типа.
Как получить имя класса в Python?
Вы можете использовать атрибут __name__, чтобы получить имя класса в Python. Например, если у вас есть класс, определенный как MainClass:, вы можете получить его имя, используя MainClass.__name__.
Есть ли другой способ получить имя класса в Python?
Да, вы можете использовать функцию type() для получения имени класса в Python. Например, если у вас есть объект obj и вы хотите получить имя его класса, вы можете использовать type(obj).__name__.
Как получить имя класса объекта в виде строки в Python?
Чтобы получить имя класса объекта в виде строки в Python, используйте функцию type() в функции для динамического получения имени класса объекта. Например, вы можете определить функцию, которая принимает объект в качестве аргумента и возвращает имя его класса, используя type(obj).__name__.
Как вызвать класс зная его имя?
У меня есть класс с заданными элементами. Я знаю имя элемента (.name характеристика) в виде строчки. Как мне получить имея эту строчку (допустим ‘apple’, имя объекта .name тоже ‘apple’) другие заданные характеристики объекта apple — массу, размеры геометрические?
создать массив со всеми объектами класса/-ов, потом пробежаться по нему, и для каждого из элементов проверять, равно ли name — «apple»?
К сожалению, все объекты класса заданы «вручную» внутри кода в виде списка в 20000 объектов свернутых в спойлер. Нет более быстрого способа?
3 ответа 3
# Класс у вас уже есть, привёл его просто для примера class products(object): def __init__(self, name, weight): self.weight = weight self.name = name # Ваши 20000 объектов, которые уже есть в коде: o1 = products('banana', 1) o2 = products('apple', 2) # . o20000 = products('cherry', 3) # А вам нужно дописать что-то подобное # Перебираем все объекты в области видимости for obj in locals().values(): # Если объект является экземпляром класса products # и его свойство name равно 'apple' if isinstance(obj, products) and obj.name == 'apple': # Напечатаем значение его свойства weight print(obj.weight) # Напечатает только число 2, т.к. именно такой weight у объекта с name == 'apple'
Я немного правил ответ, возможно, вы запускали более раннюю версию. Проверьте, что у вас эта строка выглядит именно так, как сейчас у меня: for obj in locals().values():
for obj in locals().values(): RuntimeError: dictionary changed size during iteration Ругается именно на эту строку.