2010-07-05 65 views
11

Làm cách nào để tạo danh sách đối tượng (thể hiện lớp) bằng Python?Tạo danh sách các đối tượng trong Python

Hoặc đây có phải là kết quả của thiết kế kém không? Tôi cần điều này vì tôi có các đối tượng khác nhau và tôi cần phải xử lý chúng ở giai đoạn sau, vì vậy tôi sẽ tiếp tục thêm chúng vào danh sách và gọi chúng sau này.

+2

Bạn có nghĩa là một danh sách các đối tượng loại ('[type (x), ...]') hoặc các thể hiện của một lớp ('[1, 2, 3]')? – Skurmedel

+0

@Skurmedel: các phiên bản lớp. Tôi đã đề cập đến nó một cách cụ thể trong câu hỏi :) – user225312

+0

@Alfred: hehe, tôi chỉ tìm thấy các trường hợp một chút mơ hồ, nhưng tôi thấy ý của bạn bây giờ thông qua câu trả lời đã chọn: P – Skurmedel

Trả lời

32

lưu trữ một danh sách các trường hợp đối tượng là rất đơn giản

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 
+0

Nơi bạn vượt qua "đối tượng" trong dòng đầu tiên, rằng một đối tượng thực sự hoặc chỉ là một số biểu thị số của cá thể đối tượng đó? Nếu tôi viết my_objects (1), Tôi sẽ gọi cho đối tượng đầu tiên, nhưng tôi không nghĩ rằng 1 được truyền vào là một đối tượng. Điều này có thể hoàn toàn trực giao với mục đích giáo dục của câu trả lời ban đầu, nhưng nó sẽ giúp tôi về một chủ đề khác, liên quan mà tôi đang gặp khó khăn. Cảm ơn. –

4

Hướng dẫn Python thảo luận về how to use lists.

Lưu trữ danh sách các lớp không khác với lưu trữ bất kỳ đối tượng nào khác.

def MyClass(object): 
    pass 

my_types = [str, int, float, MyClass] 
-1

Tôi nghĩ rằng những gì bạn đang làm ở đây là sử dụng một cấu trúc chứa trường lớp học của bạn. Tôi không biết cú pháp để đặt tên cấu trúc trong python, nhưng trong perl tôi có thể tạo một cấu trúc obj.id [x] trong đó x là một số nguyên tăng dần. Sau đó, tôi chỉ có thể tham khảo lại ví dụ lớp cụ thể mà tôi cần bằng cách tham khảo cấu trúc số. Đây có phải là thứ gì theo hướng bạn đang cố gắng làm không?

2

Trong Python, tên của lớp là tham chiếu đến cá thể lớp. Xem xét:

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

lst = [A, B, C] 

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

nếu my_list là danh sách mà bạn muốn để lưu trữ đối tượng của bạn trong đó và my_object là đối tượng của bạn muốn được lưu trữ, sử dụng cấu trúc này:

my_list.append(my_object) 
0

Tôi có một số câu trả lời hacky rằng có thể là khủng khiếp ... nhưng tôi có rất ít kinh nghiệm vào thời điểm này.

một cách:

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) 

Một cách hack để có được điều này thực hiện:

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) 

Một thêm 'thông minh' 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) 
Các vấn đề liên quan