2010-07-28 15 views
31

के रूप में पाइथन कक्षा का उपयोग करना कभी-कभी क्लस्टर संबंधित डेटा को एक साथ समझ में आता है। मैं जैसे एक dict के साथ ऐसा करने के लिए,,डेटा कंटेनर

self.group = dict(a=1, b=2, c=3) 
print self.group['a'] 

अपने सहयोगियों में से एक एक वर्ग

class groupClass(object): 
    def __init__(a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 
self.group = groupClass(1, 2, 3) 
print self.group.a 

ध्यान दें कि हम किसी भी वर्ग के तरीकों को परिभाषित नहीं कर रहे हैं बनाने के लिए पसंद करते हैं करते हैं।

मुझे एक नियम का उपयोग करना पसंद है क्योंकि मुझे कोड की रेखाओं की संख्या को कम करना पसंद है। मेरे सहयोगी सोचते हैं कि यदि आप कक्षा का उपयोग करते हैं तो कोड अधिक पठनीय है, और भविष्य में कक्षा में विधियों को जोड़ना आसान बनाता है।

आप कौन सा पसंद करते हैं और क्यों?

+1

आपका सहयोगी एक नया प्रोग्रामर होना चाहिए। –

+0

मामूली नाइटपिक: आप 'प्रिंट self.group [' a '] ' –

+3

@Jesse का उपयोग करेंगे: नहीं, वह एक नया प्रोग्रामर नहीं है (और वह एक अच्छा प्रोग्रामर है), लेकिन वह पाइथन से अधिक जावा करता है, इसलिए वह बहुत कुछ जोड़ना पसंद करता है कोड (गेटर्स, इत्यादि) जो मुझे लगता है अनावश्यक है। मैं भी अपनी स्थिति का प्रतिनिधित्व नहीं कर सकता हूं। –

उत्तर

32

तुम सच में कभी नहीं किसी भी वर्ग के तरीकों, एक dict या एक namedtuple को परिभाषित कर रहे हैं कहीं अधिक समझ बनाने के , मेरी राय में। सरल + बिल्टिन अच्छा है! आप चाहें या न चाहें मुझसे यह पसंद है।

+8

नामांकित हैं महान; बस याद रखें कि वे अपरिवर्तनीय हैं। और भूलें कि क्या आपको कक्षा के तरीकों को बाद में जोड़ने की ज़रूरत है, तो आप हमेशा नामांकित के परिणाम से ही उत्तराधिकारी हो सकते हैं। जैसे 'क्लास प्वाइंट (नामांकित (' प्वाइंट ',' एक्स वाई ')): ... ' –

+0

सभी के आसपास महान जवाब। मैंने इसे चुना क्योंकि मुझे नामांकित करने की कोशिश करने के लिए सुझाव पसंद है। –

+2

ओपी कोड के साथ 'nametuple' का उपयोग करने का एक उदाहरण अच्छा हो सकता है। – tokland

8

मैं YAGNI का पालन करना पसंद करता हूं और एक dict का उपयोग करता हूं।

+0

मैं सहमत हूं, सिवाय इसके कि मैं वास्तव में विशेषता पहुंच (जावास्क्रिप्ट में) की सुविधा का आनंद लेता हूं, इसलिए मैं एक [विशेषता डिक्ट] का उपयोग करना पसंद करता हूं (http://stackoverflow.com/questions/4984647/accessing-dict-keys-like- एक-विशेषता में अजगर)। – voithos

1

एक भाषा में जो इसका समर्थन करता है, मैं struct का उपयोग करूंगा। एक शब्दकोष पाइथन में एक संरचना के निकटतम होगा, कम से कम जहां तक ​​मैं इसे देखता हूं।

नहीं उल्लेख करने के लिए, तुम वैसे भी एक शब्दकोश के लिए एक विधि जोड़ सकता है अगर आप वास्तव में करना चाहता था;)

2

मैं इस बात से असहमत हूं कि कोड किसी भी तरीके से कक्षा का उपयोग करके अधिक पठनीय है। आप आमतौर पर कक्षा से कार्यक्षमता की अपेक्षा करते हैं, न केवल डेटा।

तो, मैं जब तक कार्यक्षमता के लिए जरूरत पड़ने पर एक dict के लिए जाना चाहते हैं, और फिर वर्ग के निर्माता एक dict :-)

1

एक dict प्राप्त कर सकता है जाहिर है कि स्थिति के लिए उपयुक्त है। यह विशेष रूप से उस उपयोग के मामले के लिए बनाया गया था। जब तक कि आप वास्तव में कक्षा के रूप में कक्षा का उपयोग नहीं कर रहे हैं, तब तक व्हील को पुनर्निर्मित करने और अतिरिक्त ओवरहेड/एक कक्षा के स्थान को बर्बाद करने में कोई उपयोग नहीं है जो खराब शब्दकोश (कोई शब्दकोश विशेषताओं) के रूप में कार्य करता है।

4

आपका रास्ता बेहतर है। भविष्य की अपेक्षा करने की कोशिश न करें क्योंकि आप सफल होने की संभावना नहीं रखते हैं।

हालांकि, it may make sense sometimes to use something like a C struct, उदाहरण के लिए यदि आप सब कुछ के लिए उपयोग करने के बजाय विभिन्न प्रकारों की पहचान करना चाहते हैं।

2

आप dict से विरासत में प्राप्त कुछ रैपर वर्ग का उपयोग करके, एक साथ dict और कक्षा के फायदे को जोड़ सकते हैं। आपको बॉयलरप्लेट कोड लिखने की आवश्यकता नहीं है, और साथ ही डॉट नोटेशन का उपयोग भी कर सकते हैं।

class ObjDict(dict): 
    def __getattr__(self,attr): 
     return self[attr] 
    def __setattr__(self,attr,value): 
     self[attr]=value 

self.group = ObjDict(a=1, b=2, c=3) 
print self.group.a 
2

वहाँ एक नया प्रस्ताव है कि लागू करने के लिए आप के लिए वास्तव में क्या देख रहे हैं करना है, data classes कहा जाता है। इस पर एक नज़र मारो।

एक नियम पर कक्षा का उपयोग प्राथमिकता का विषय है। व्यक्तिगत रूप से मैं एक नियम का उपयोग करना पसंद करता हूं जब चाबियों को प्राथमिकता नहीं माना जाता है। (मैपिंग कंटेनर के रूप में)।

डेटा धारण करने के लिए कक्षा का उपयोग करना मतलब है कि आप कक्षा विशेषताओं को दस्तावेज़ीकरण प्रदान कर सकते हैं।

व्यक्तिगत रूप से, शायद कक्षा का उपयोग करने के लिए मेरे लिए सबसे बड़ा कारण आईडीई ऑटो-पूर्ण सुविधा का उपयोग करना है! (तकनीकी रूप से एक लंगड़ा कारण, लेकिन व्यवहार में बहुत उपयोगी)

+0

प्रस्ताव अब पायथन 3.7 में आधिकारिक है –

3

पृष्ठभूमि

वैकल्पिक विशेषता के आधार पर, डेटा कंटेनर का एक सारांश एस एफ पायथन के 2017 छुट्टी बैठक में आर Hettinger द्वारा पेश किया गया। उसका tweet और उसका slide deck देखें।

अन्य डेटा कंटेनर प्रकारों का उल्लेख इस article में किया गया है और मुख्य रूप से पायथन 3 दस्तावेज़ में (नीचे दिए गए लिंक देखें)।

विकल्प में मानक पुस्तकालय

  • collections.namedtuple

    विकल्प: गुण

  • साथ टपल
  • typing.NamedTuple: उप classable टपल
  • types.SimpleNamedspace: साधारण क्लास डब्ल्यू/वैकल्पिक वर्ग घोषणा
  • types.MappingProxy: केवल पढ़ने के लिए dict
  • enum.Enum: संबंधित स्थिरांक की विवश संग्रह (एक वर्ग की तरह व्यवहार करता है)
  • dataclasses.dataclass: डिफ़ॉल्ट/बॉयलरप्लेट कम वर्गों के साथ परिवर्तनशील namedtuple

बाहरी विकल्पों

  • records: mutable nametuple
  • bunches: dicts के लिए विशेषता पहुँच जोड़ (SimpleNamedspace के लिए प्रेरणा)
  • box: dot-style lookup कार्यक्षमता

कौन सा साथ dicts लपेट?

निर्णय लेने का विकल्प किस स्थिति पर निर्भर करता है। आम तौर पर एक पुराने फैशन वाले म्यूटेबल डिक्शनरी या अपरिवर्तनीय नामांकित पर्याप्त है। attrs प्रोजेक्ट से प्रेरित कम बॉयलरप्लेट के वादे के साथ डेटा क्लासेस नवीनतम जोड़ (पायथन 3.7 ए) दोनों उत्परिवर्तन और optional immutability की पेशकश कर रहे हैं।

0

Prodict के बारे में क्या:

class Person(Prodict): 
    name: str 
    email: str 
    rate: int 

john = Person(name='John', email='[email protected]') 
john.rate = 7 
john.age = 35 # dynamic 
संबंधित मुद्दे