2012-07-02 12 views
13

मुझे यह समस्या थोड़ी सी GUI lib लिख रही है जो कक्षाओं को सरल तालिका दृश्यों में मैप करती है। एक निश्चित प्रकार = कॉलम के प्रत्येक वर्ग सदस्य, और कॉलम का क्रम महत्वपूर्ण है। लेकिन ...उनकी घोषणा के क्रम में वर्ग सदस्यों के माध्यम से Iterate

class Person(object): 

    name = None 
    date_of_birth = None 
    nationality = None 
    gender = None 
    address = None 
    comment = None 


for member in Person.__dict__.iteritems(): 
    if not member[1]: 
     print member[0] 

उत्पादन:

comment 
date_of_birth 
name 
address 
gender 
nationality 
... 

ओह, ओडर सभी को मिलाया गया ... वांछित आउटपुट:

name 
date_of_birth 
nationality 
gender 
address 
comment 

वहाँ बनाए रखने के बिना यह करने के लिए एक रास्ता है कॉलम के अतिरिक्त OrderedDict()?

+3

एक नियम परिभाषा द्वारा असामान्य है, इसलिए आप वर्ग विशेषताओं के किसी ऑर्डरिंग पर भरोसा नहीं कर सकते हैं और आपको कहीं और ऑर्डर करना होगा। –

+0

बस एक विचार, थोड़ा बुरा लेकिन क्या आदेश दिया गया आदेश के लिए '__dict__' को स्वैप करना संभव होगा? ऑर्डर को कहीं और बनाए रखने के लिए अभी भी बेहतर हो सकता है, लेकिन – GP89

+0

@MartijnPieters को सच नहीं देखना अच्छा हो सकता है, आप इसे मेटाक्लास के माध्यम से कर सकते हैं। वास्तव में उपयोग-मामले का स्पष्ट रूप से पायथन 3.x मेटाक्लास पीईपी (3115) और ऑर्डर्ड डिक्ट पीईपी (372) दोनों में उल्लेख किया गया है। –

उत्तर

7

यह जो आप जबकि कक्षा का निर्माण किया जा रहा है metaclass में dict प्रकार ओवरराइड करने के लिए (जैसे। एक OrderedDict जो प्रविष्टि आदेश में पटरियों का उपयोग करने) की अनुमति देता है PEP3115 के प्रयोग के माध्यम python3 में संभव है। यहां इस दृष्टिकोण का कार्यान्वयन है:

class OrderedMeta(type): 
    @classmethod 
    def __prepare__(metacls, name, bases): 
     return OrderedDict() 

    def __new__(cls, name, bases, clsdict): 
     c = type.__new__(cls, name, bases, clsdict) 
     c._orderedKeys = clsdict.keys() 
     return c 

class Person(metaclass=OrderedMeta): 
    name = None 
    date_of_birth = None 
    nationality = None 
    gender = None 
    address = None 
    comment = None 

for member in Person._orderedKeys: 
    if not getattr(Person, member): 
     print(member) 

पायथन 2 में, यह बहुत अधिक कठिन है। यह स्रोत की आत्मनिरीक्षण की तरह काफी हकी के साथ प्राप्त होगा, और एएसटी से परिभाषा आदेश का काम कर रहा है, लेकिन शायद यह इसके लायक होने की तुलना में बहुत अधिक परेशानी है।

+0

यह दिलचस्प लग रहा है, धन्यवाद! लेकिन मैं पाइथन 2 का उपयोग कर रहा हूं और मुझे यकीन नहीं है कि यह मामला Py3 – AlexVhr

+0

पर स्विच को उचित ठहराता है भले ही मैं इस समाधान का उपयोग नहीं कर सकता, फिर भी यह मेरे प्रश्न के निकटतम उत्तर की तरह दिखता है। फिर से धन्यवाद। – AlexVhr

4

यदि आपको केवल चर की कुल आवश्यकता है, तो आपको इसके बजाय namedtuple का उपयोग करना चाहिए। यह खेतों के क्रम को भी बनाए रखता है (क्योंकि यह एक ट्यूपल है)।

from collections import namedtuple 
Person = namedtuple('Person', ('name', 
           'data_of_birth', 
           'nationality', 
           'gender', 
           'address', 
           'comment')) 
print Person._fields 
+0

प्रयास के लिए धन्यवाद, लेकिन अंत में यह काम पूरा होने पर, पूरा विचार घोषणा को साफ और सरल रखना था। यह समाधान मेरे लिए बहुत पठनीय नहीं दिखता है, क्षमा करें। – AlexVhr

1

ठीक है, इसे se लेकिन एक समाधान है कि केवल मूल प्रश्न के संदर्भ में काम करता है ("हर वर्ग के सदस्य एक निश्चित प्रकार = स्तंभ के [जो एक उदाहरण है] प्रति एक जवाब नहीं है, और कॉलम के क्रम महत्वपूर्ण है ")। समाधान को CertainType वर्ग में क्लास वेरिएबल _count पेश करना है, और प्रत्येक तत्कालता में इसे बढ़ाएं। इसके बाद CertainType के सभी वर्ग सदस्यों को एक सूची में पैक किया जाता है जिसे key=attrgetter('_count')

पीएस का उपयोग करके क्रमबद्ध किया जाता है। यह कहते हुए कि "जो एक उदाहरण है" भाग मेरे हिस्से पर एक गलती थी और इसमें काफी सीमित समाधान हैं। उसके लिए खेद है।

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