2011-10-18 6 views
39

मैं सोच रहा था कि कक्षा के शरीर में या __init__ फ़ंक्शन के अंदर पाइथन में ऑब्जेक्ट विशेषताओं को प्रारंभ करने के लिए सबसे अच्छा अभ्यास क्या था?पाइथन कक्षा में प्रारंभिकरण/घोषणा का गुण: उन्हें कहां रखा जाए?

यानी

class A(object): 
    foo = None 

बनाम

class A(object): 
    def __init__(self): 
     self.foo = None 

उत्तर

49

यदि आप चाहते हैं विशेषता वर्ग के सभी उदाहरणों द्वारा साझा करने, एक वर्ग विशेषता का उपयोग करें:

class A(object): 
    foo = None 

यह ('foo',None) का कारण बनता है A.__dict__ में जोड़ी होने के लिए।

class A(object): 
    def __init__(self): 
     self.foo = None 

यह a.__dict__ में एक (key,value) जोड़ी जहां a=A()A का एक उदाहरण है होना करने के लिए ('foo',None) कारण बनता है:

आप विशेषता एक प्रति उदाहरण के आधार पर अनुकूलन होना चाहते हैं, एक उदाहरण विशेषता का उपयोग।

+1

समझ में आता है, मैंने सोचा कि वे दोनों मामलों में उदाहरण के लिए बाध्य थे ... धन्यवाद :) – fortran

+6

पायथन के पास [विशेषता लुकअप नियम] का एक जटिल सेट है (http://www.cafepy.com/article/python_attributes_and_methods/ python_attributes_and_methods.html)। वर्णनकर्ताओं के बिना, इस मामले के लिए यह 'f .' कुंजी' के लिए पहले 'a .__ dict__' की खोज की गई है, और यदि यह वहां नहीं मिला है, तो' ए .__ dict__' खोजा गया है। यही कारण है कि आप 'a.foo' का उपयोग कर सकते हैं भले ही 'foo' एक क्लास विशेषता है। – unutbu

+1

यह भी ध्यान देने योग्य है कि क्लास विशेषताओं के लिए, यदि आप 'a.foo = जो भी' करना चाहते थे, तो आप वास्तव में एक नया इंस्टेंस विशेषता बनाना चाहते हैं (जो कक्षा विशेषता को छुपाता है)। 'एफू' अपरिवर्तित होगा। यह थोडाचा है, क्योंकि आप 'एफू' के मूल्य को 'ए.फू' के साथ एक्सेस कर सकते हैं, लेकिन इसे असाइन करने से एक नया इंस्टेंस एट्रिब्यूट बन जाएगा। – Kat

2

कक्षा परिभाषा में परिभाषित गुण वर्ग चर (जावा में स्थिर चर जैसे) माना जाता है, जबकि प्रारंभकर्ता में सेट किए गए उदाहरण उदाहरण गुण हैं (self.something = 1 और something = 1 के बीच अंतर को नोट करें)। अधिक जानकारी के लिए this question और this one और भी देखें। इन दो मामलों के बीच बहुत व्यावहारिक अंतर नहीं है, क्योंकि कक्षा-स्तर की परिभाषा विशेषता को डिफ़ॉल्ट मान देती है, लेकिन यदि आप ऑब्जेक्ट इंस्टेंस का उपयोग करने से पहले एक विशेषता सेट करने के लिए किसी प्रकार का तर्क उपयोग करना चाहते हैं तो आपको इसे करना चाहिए __init__() विधि।

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