python - How can I get fields in an original order? -


मेरे पास एक कोड है:

  वर्ग क्रमबद्ध (ऑब्जेक्ट): x = 0 z = 0 बी = 0 ए = 0 प्रिंट (डायरे (ऑर्डर्ड))  

यह प्रिंट करता है:

  [......., a, B, x, z]  

मैं एक मूल क्रम में फ़ील्ड कैसे प्राप्त करूं: x, z, b, a? मैंने Django मॉडल में समान व्यवहार देखा है।

जैसा कि ऊपर वर्णित है, अगर आप चीजों को सरल रखना चाहते हैं , सिर्फ एक उदाहरण _ordering विशेषता का उपयोग करें, जो मैन्युअल रूप से आदेश का ट्रैक रखता है।

मूल आदेश रिकॉर्डिंग

क्लासेस डॉन 'डॉन' टी के गुणों के आदेश का ट्रैक रखें आप इस बात का ध्यान रख सकते हैं कि किस प्रकार क्षेत्र के उदाहरण बनाए गए थे। इसके लिए, आपको खेतों के लिए अपनी कक्षा का उपयोग करना होगा (नहीं int)। क्लास इस बात पर नज़र रखता है कि कितने उदाहरण पहले से ही किए गए हैं और प्रत्येक उदाहरण अपनी स्थिति का ध्यान रखता है। यहां बताया गया है कि आप अपने उदाहरण (भंडार पूर्णांक) के लिए कैसे करेंगे:

  वर्ग MyOrderedField (int): creation_counter = 0 def __init __ (आत्म, वैल): # उदाहरण के काउंटर को सेट करने के लिए स्वयं को आदेश देने का ट्रैक .creation_counter = myOrderedField.creation_counter # भविष्य के उदाहरणों के लिए वर्ग के काउंटर को बढ़ाएं MyOrderedField.creation_counter + = 1  

एक आदेश_टम्स विशेषता को स्वचालित रूप से बनाना

अब जब आपके खेतों में एक संख्या होती है जिसका उपयोग उन्हें ऑर्डर करने के लिए किया जा सकता है, तो आपके पैरेंट क्लास को किसी तरह का उपयोग करने की आवश्यकता है। अगर आप सही तरीके से याद रखते हैं, तो आप इसे विभिन्न तरीकों से कर सकते हैं, Django Metaclasses का उपयोग करने के लिए करता है, जो साधारण वर्ग के लिए थोड़ी जंगली है।

  वर्ग बेसविथ ऑर्डर किए गए फ़िल्ट्स (प्रकार): "मेटाक्लास", जो कि "ऑर्डर_फल्ड्स" विशेषता प्रदान करता है, वर्ग विशेषताओं की एक अनुक्रमित सूची होती है, जिसमें एक "creation_counter" विशेषता होती है। "" डीईएफ़ __new __ ( Cls, name, bases, attrs): new_class = super (BaseWithOrderedFields, cls) .__ नया __ (सीएलएस, नाम, कुर्सियां, एटर्स) # आदेश, ऑर्डर करने योग्य फ़ील्ड new_class._ordered_items = [(नाम, attrs.pop तक पहुंचने के लिए एक विशेषता जोड़ें नाम)) नाम के लिए, obj in attrs.items () यदि हेट्ट्रर (obj, "creation_counter")] new_class._ordered_items.sort (कुंजी = लैम्ब्डा आइटम: आइटम [1] .creation_counter) new_class वापसी  

इस मेटाकल्स का उपयोग

तो, आप इसका उपयोग कैसे करते हैं? सबसे पहले, आपको अपने गुणों को परिभाषित करते समय हमारी नई MyOrderedField वर्ग का उपयोग करना होगा। यह नया वर्ग उस क्रम का ट्रैक रखता है जिसमें खेतों का निर्माण किया गया था:

  वर्ग का आदेश दिया गया (ऑब्जेक्ट): __metaclass__ = बेसवेथऑर्डर्डफिल्डज एक्स = मायऑर्डिल्डफिल्ड (0) z = मायऑर्डिल्डफिल्ड (0) बी = मायऑर्डिल्डफिल्ड (0) a = MyOrderedField (0)  

तब आप अपने स्वचालित रूप से निर्मित विशेषता order_fields में दिए गए फ़ील्ड का उपयोग कर सकते हैं:

  & gt; & gt; & gt; आदेश दिया गया = आदेश दिया ()> gt; & gt; & gt; ('ए', 0), ('ए', 0)]  

के लिए नि: शुल्क लग रहा है ('एक्स', 0), ('z', 0), ('बी', 0) इसे किसी आदेश के अनुसार परिवर्तित करें या सिर्फ नाम या जो कुछ भी आप की आवश्यकता है उसे वापस करें। इसके अतिरिक्त, आप __ मेटाक्लास __ के साथ एक खाली वर्ग को परिभाषित कर सकते हैं और वहां से वार कर सकते हैं।

इसका उपयोग न करें!

जैसा कि आप देख सकते हैं, यह दृष्टिकोण थोड़ी अधिक जटिल है और शायद अधिकांश कार्यों या अजगर डेवलपर्स के लिए उपयुक्त नहीं है। यदि आप अजगर के लिए नशे की लत हैं, तो संभवतः आप अपने मेटाक्लास को विकसित करने में और अधिक समय और प्रयास खर्च करेंगे, यदि आप मैन्युअल रूप से क्रम को परिभाषित करते हैं अपनी खुद की ऑर्डरिंग को मैन्युअल रूप से परिभाषित करना हमेशा सबसे अच्छा तरीका है Django स्वचालित रूप से ऐसा करते हैं क्योंकि जटिल कोड अंत डेवलपर से छिपा हुआ है, और Django को अधिक बार इसकी तुलना में लिखा / रखरखाव किया जाता है। इसलिए केवल अगर आप अन्य डेवलपर्स के लिए एक ढांचा विकसित कर रहे हैं, तो मेटाकल्स आपके लिए उपयोगी हो सकते हैं।


Comments