如何创建对象列表?

Posted

技术标签:

【中文标题】如何创建对象列表?【英文标题】:How to create a list of objects? 【发布时间】:2011-03-12 01:32:21 【问题描述】:

如何在 Python 中创建对象列表(类实例)?

或者这是糟糕设计的结果?我需要这个,因为我有不同的对象,我需要在以后处理它们,所以我会继续将它们添加到列表中并稍后调用它们。

【问题讨论】:

您是指类型对象列表 ([type(x), ... ]) 还是类实例 ([1, 2, 3])? @Skurmedel:类实例。我在问题中特别提到了它:) @Alfred:呵呵,我只是觉得类实例有点模棱两可,但我现在通过选择的答案明白你的意思了:P 【参考方案1】:

您可以使用列表推导在一行中创建对象列表。

class MyClass(object): pass

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

print(objs)

【讨论】:

这是非常干净的语法。 小细节:objs = [MyClass(i) for i in range(10)]【参考方案2】:

我有一些可能很糟糕的老生常谈的答案......但我在这一点上的经验很少。

一种方式:

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)

另一个更“聪明”的 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)

【讨论】:

【参考方案3】:

存储对象实例列表非常简单

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

【讨论】:

你在第一行传递“object”的地方,是一个实际的对象还是只是一个表示该对象实例编号的数字?如果我要写 my_objects(1),我会调用第一个对象,但我不认为传入的 1 是一个对象。这可能与原始回复的教育目的完全正交,但它会帮助我解决我正在努力解决的另一个相关主题。谢谢。 T'希望有一个闪亮的特殊语法:( @Brad English,表示MyClass继承了object的属性 MyClass (i) 中的i 指的是类的__init__ 函数中的number【参考方案4】:

如果 my_list 是您要在其中存储对象的列表,而 my_object 是您要存储的对象,请使用以下结构:

my_list.append(my_object)

【讨论】:

【参考方案5】:

在 Python 中,类的名称是指类实例。考虑:

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

lst = [A, B, C]

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

【讨论】:

【参考方案6】:

我认为您在这里所做的是使用包含您的类实例的结构。我不知道在 python 中命名结构的语法,但在 perl 中我可以创建一个结构 obj.id[x] 其中 x 是一个递增的整数。然后,我可以通过引用数字结构来引用我需要的特定类实例。这是否朝着您想要做的方向发展?

【讨论】:

【参考方案7】:

Python 教程讨论了how to use lists。

存储类列表与存储任何其他对象没有什么不同。

def MyClass(object):
    pass

my_types = [str, int, float, MyClass]

【讨论】:

以上是关于如何创建对象列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用另一个列表中的对象的属性创建一个新列表

删除父对象时如何删除由stream.flatMap创建的列表中的子对象?

如何在Python中的for循环内创建对象列表而不继承属性值[重复]

如何使用 BLOC 为对象列表创建流和接收器

Terraform:如何从对象列表创建 API 网关端点和方法?

如何在Java中为不同的对象创建单独的列表?