2011-12-20 14 views
11

मैं पाइथन में फ्लाई पर ऑब्जेक्ट्स कैसे बना सकता हूं? मैं अक्सर अपने Django टेम्पलेट्स को जानकारी पास करना चाहता हूं जो इस तरह स्वरूपित है:पाइथन में फ्लाई पर ऑब्जेक्ट्स कैसे बनाएं?

{'test': [a1, a2, b2], 'test2': 'something else', 'test3': 1} 

जो टेम्पलेट को अस्पष्ट दिखता है। बजाय

{{ testobj.test }} 
{{ testobj.test2 }} 
{{ testobj.test3 }} 

शब्दकोश बुलाने की: तो मुझे लगता है कि यह सिर्फ एक वस्तु जो है की तरह बनाने के लिए बेहतर है:

class testclass(): 
    self.test = [a1,a2,b2] 
    self.test2 = 'someting else' 
    self.test3 = 1 
testobj = testclass() 

तो मैं कर सकता हूँ।

चूंकि मुझे केवल उस वस्तु की आवश्यकता है, क्या इसे पहले कक्षा लिखने के बिना बनाना संभव है? क्या कोई छोटा हाथ कोड है? क्या ऐसा करना ठीक है या क्या यह पाइथन खराब है?

+5

ठीक है, पहले आपको फ्लाई अभी भी खड़ा होना है। फिर आपको कुछ बहुत छोटी वस्तुओं को बनाने की ज़रूरत है ... (क्षमा करें, विरोध नहीं कर सका।) –

उत्तर

22

आप अंतर्निहित उपयोग कर सकते हैं type function:

testobj = type('testclass', (object,), 
       {'test':[a1,a2,b2], 'test2':'something else', 'test3':1})() 

लेकिन इस विशेष मामले (Django टेम्पलेट्स के लिए डेटा ऑब्जेक्ट) में, आप का उपयोग करना चाहिए @ Xion समाधान।

+5

कृपया यह मत करें। सरल जटिल से बेहतर है। –

+1

@ संख्या 5 यदि आप इस कोड का उपयोग न करने का सुझाव देते हैं तो मैं आपके उत्तर के लिए वोट दूंगा! (कम से कम इस विशिष्ट मामले के लिए नहीं) –

+0

+1 यह Google से पूछे गए प्रश्न का उत्तर देता है। – MrOodles

19

Django टेम्पलेट्स में, डॉट नोटेशन (testobj.test) पाइथन के [] ऑपरेटर को हल कर सकता है। इसका मतलब है कि आप सभी की जरूरत एक साधारण dict है: अपने टेम्पलेट

testobj = {'test':[a1,a2,b2], 'test2':'something else', 'test3':1} 

पास यह रूप में testobj चर और आप स्वतंत्र रूप से अपने टेम्पलेट के अंदर {{ testobj.test }} और इसी तरह के भाव का उपयोग कर सकते हैं। उनका अनुवाद testobj['test'] में किया जाएगा। यहां कोई समर्पित वर्ग की आवश्यकता नहीं है।

+0

धन्यवाद, जिसने मेरी समस्या के डीजेंगो से संबंधित हिस्से को हल किया :) मैंने अभी दूसरे जवाब की जांच की क्योंकि Google से यहां आने वाले लोग शायद पाइथन से संबंधित उत्तर देखना पसंद करेंगे। – JasonTS

+1

@ जेसनटीएस, अजगर से संबंधित उत्तर कार्ल कंचटेल के 'संग्रह। नामकरण' के उत्तर का उपयोग करना होगा। – Duncan

0

कोड के नीचे भी एक वर्ग की आवश्यकता बनाया जाना है, लेकिन यह है कम:

>>>d = {'test':['a1','a2','b2'], 'test2':'something else', 'test3':1} 
>>> class Test(object): 
... def __init__(self): 
... self.__dict__.update(d) 
>>> a = Test() 
>>> a.test 
['a1', 'a2', 'b2'] 
>>> a.test2 
'something else' 
5

वहाँ में एक और उपाय है Python 3.3+types.SimpleNamespace

from types import SimpleNamespace 
test_obj = SimpleNamespace(a=1, b=lambda: {'hello': 42}) 

test_obj.a 
test_obj.b() 
0

उपयोग इमारत समारोह के प्रकार: document

>>> class X: 
...  a = 1 
... 
>>> X = type('X', (object,), dict(a=1)) 

पहला और दूसरा एक्स पहचानकर्ता है कैल

संबंधित मुद्दे