2012-04-18 15 views
5

मुझे कक्षा वर्ग में प्रवेश करने के लिए एक निर्देश मिलता है। व्यक्ति में एक फ़ील्ड है: 'नाम'। 'नाम' फ़ील्ड वैकल्पिक है, जिसका अर्थ है कि यदि निर्देश में 'नाम' आइटम नहीं है, तो व्यक्ति का कोई 'नाम' मान नहीं है। मैं इंस्टेंस विशेषता प्राप्त करने के लिए गेटर विधियों का उपयोग करता हूं, लेकिन यदि कोई 'नाम' मान नहीं है तो यह एक त्रुटि फेंक देगा। मुझे नहीं पता कि मेरे कोड को बेहतर बनाने के लिए कोई अच्छी प्रोग्रामिंग शैली है? चूंकि पाइथन रन टाइम पर इंस्टेंस फ़ील्ड बनाते हैं, इसलिए मुझे नहीं पता कि जावा जैसे गेटर का उपयोग कैसे करें।पायथन: उदाहरण विशेषता त्रुटि

class Person: 
    def __init__(self,person_dict): 
     try: 
      self.name = person_dict['name'] 
     except Exception: 
      pass 

    def getName(self): 
     return self.name 

pdict = {} 
p = Person(pdict) 
print p.getName() 

AttributeError: व्यक्ति उदाहरण कोई विशेषता 'नाम'

+0

जैसा कि आप पहले से ही जवाब में देख चुके हैं, गेटर्स 'पायथनिक' या अच्छे पायथन कोड नहीं हैं। [यहां] (http://tomayko.com/writings/getters-setters-fuxors) यह एक महान लेख है कि यह क्यों है। आलेख को सारांशित करने के लिए: जावा को हमेशा गेटर्स/सेटर्स की आवश्यकता होती है क्योंकि उनके बिना, उनका उपयोग करने के लिए प्रतिक्रिया करना कठिन होता है। पायथन के साथ, आप अपना इंटरफ़ेस नहीं बदलते हैं, क्योंकि आप [गुण] (http://docs.python.org/library/functions.html#property) का उपयोग कर सकते हैं। – Darthfett

उत्तर

6
class Person: 

    def __init__(self,person_dict): 
     self.name = person_dict.get('name') 

इस मामले self.name = person_dict.get('name') अपवाद से आगे नहीं बढ़ेगी और व्यक्ति वस्तुओं name विशेषता होगी (None डिफ़ॉल्ट रूप से)

युपीडी में है । getName विधि बेकार है, इसलिए मैंने इसे उदाहरण से नीचे काट दिया। name सीधे प्रवेश करें।

+0

यह ध्यान देने योग्य है कि पाइथन में 'गेटर' विधियां खराब अभ्यास हैं - इसे सीधे एक्सेस करें। –

+0

मैंने अभी अपना कोड दोहराया है। – San4ez

+0

मुझे पता है, मैं सिर्फ एक जवाब कह रहा हूं जो नोट करता है कि यह एक बेहतर है। –

3
class Person: 
    def __init__(self,person_dict): 
     self.name = person_dict.get('name', 'default_name') 

pdict = {} 
p = Person(pdict) 
print p.name # there is no need for getter 
+0

+1। यह एक बेहतर जवाब है, गेटर्स एक बुरा अभ्यास है। –

+0

धन्यवाद, अब मुझे पता है कि गेटटर एक अच्छी शैली नहीं है – remy

0

आप अपवाद नहीं करना चाहते हैं, तो आप यकीन है कि उदाहरण के लिए name एक मूल्य है बनाना चाहिए। चूंकि लुकअप कक्षा में वापस आ जाता है यदि उदाहरण पर कोई विशेषता नहीं मिल पाती है, तो ऐसा करने का एक आसान तरीका क्लास परिभाषा में केवल name = None (या जो भी डिफ़ॉल्ट मान आप उपयोग करना चाहते हैं) जोड़ना है। उदाहरण पर विशेषता के लिए असाइनमेंट डिफ़ॉल्ट मान को "छुपा" देगा।

class Person: 
    name = None 
    def __init__(self,person_dict): 
     try: 
      self.name = person_dict['name'] 
     except Exception: 
      pass 

इसके बजाय आप इस तरह अपने __init__ लिख सकते हैं:

def __init__(self,person_dict): 
    self.name = person_dict.get('name') 

शब्दकोशों की get() विधि रिटर्न None यदि कुंजी नहीं मिला है, या आप एक अलग डिफ़ॉल्ट मान के साथ एक दूसरा तर्क प्रदान कर सकते हैं ।

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