2010-07-05 3 views
11

में ऑब्जेक्ट्स की एक सूची बनाना Python में ऑब्जेक्ट्स (क्लास इंस्टेंस) की सूची बनाने के बारे में मैं कैसे जा सकता हूं?पायथन

या यह खराब डिजाइन का परिणाम है? मुझे इस कारण की ज़रूरत है कि मेरे पास अलग-अलग वस्तुएं हैं और मुझे बाद में उन्हें संभालने की ज़रूरत है, इसलिए मैं उन्हें एक सूची में जोड़ना जारी रखूंगा और बाद में उन्हें कॉल करूँगा।

+2

आप प्रकार वस्तुओं की एक सूची मतलब क्या ('[प्रकार (एक्स), ...]') या एक वर्ग के उदाहरण ('[1, 2, 3]')? – Skurmedel

+0

@ स्कुरमेडेल: कक्षा के उदाहरण। मैंने इसे विशेष रूप से प्रश्न में वर्णित किया है :) – user225312

+0

@Alfred: हे, मुझे बस क्लास उदाहरण थोड़ा अस्पष्ट लगता है, लेकिन मुझे लगता है कि अब चयनित उत्तर के माध्यम से आपका क्या मतलब है: पी – Skurmedel

उत्तर

32

वस्तु उदाहरणों की एक सूची भंडारण

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

जहां आप पहली पंक्ति में "ऑब्जेक्ट" पास करते हैं, है कि एक वास्तविक ऑब्जेक्ट या ऑब्जेक्ट इंस्टेंस की संख्या को इंगित करने वाला केवल एक नंबर? यदि मुझे my_objects (1), लिखना था, तो मैं पहली वस्तु पर कॉल करूंगा, लेकिन मुझे नहीं लगता कि 1 में पारित होने वाला एक ऑब्जेक्ट है। यह मूल प्रतिक्रिया के शैक्षणिक उद्देश्यों के लिए पूरी तरह से ऑर्थोगोनल हो सकता है, लेकिन यह मुझे एक अलग, संबंधित विषय पर मदद करेगा जिसमें मैं संघर्ष कर रहा हूं। धन्यवाद। –

4

पायथन ट्यूटोरियल how to use lists पर चर्चा करता है।

कक्षाओं की एक सूची संग्रह करना किसी भी अन्य वस्तुओं को संग्रहीत करने से अलग नहीं है।

def MyClass(object): 
    pass 

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

मुझे लगता है कि क्या आप एक संरचना अपनी कक्षा उदाहरणों वाले उपयोग कर रहा है यहां क्या कर रहे हैं की बहुत सरल है। मुझे पायथन में संरचनाओं के नामकरण के लिए वाक्यविन्यास नहीं पता है, लेकिन perl में मैं एक संरचना obj.id बना सकता हूं [x] जहां x एक incremented पूर्णांक है। फिर, मैं संख्यात्मक रूप से संरचना को संदर्भित करके आवश्यक विशिष्ट वर्ग उदाहरण को वापस देख सकता था। क्या आप यह करने की कोशिश कर रहे हैं कि आप क्या करने की कोशिश कर रहे हैं?

2

पायथन में, कक्षा का नाम कक्षा के उदाहरण को संदर्भित करता है। पर विचार करें:

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

lst = [A, B, C] 

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

अगर my_list सूची है कि आप इसे में अपनी वस्तुओं संग्रहीत करना चाहते हैं और my_object अपने वस्तु, संग्रहीत करने के लिए इस संरचना का उपयोग करना चाहता था है:

my_list.append(my_object) 
0

मैं कुछ hacky जवाब है भयानक होने की संभावना है ... लेकिन इस बिंदु पर मुझे बहुत कम अनुभव है।

एक तरह से:

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)