2009-05-16 14 views
15

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

def generate_data(): 
    ... do some analysis and return complex object e.g. list ... 

class Coo: 
    data_member = generate_data() 
    ... rest of class code ... 

समारोह generate_data एक लंबे समय लगता है पूरा करने के लिए और डेटा है कि चल रहे एक कार्यक्रम के दायरे में निरंतर बनी हुई रिटर्न: कैसे pythonic कुछ इस तरह है। मैं नहीं चाहता कि हर बार कक्षा कोओ को तत्काल चालू किया जाए।

इसके अलावा, सत्यापित करने के लिए, जब तक मैं data_member पर __init__ में कुछ भी निर्दिष्ट नहीं करता, तो यह "स्थैतिक" रहेगा? क्या होगा यदि कोओ में कोई विधि कुछ मूल्य data_member (मान लीजिए कि यह एक सूची है) - क्या यह अतिरिक्त शेष उदाहरणों के लिए उपलब्ध होगा?

धन्यवाद

+0

उस कोड के बारे में एकमात्र चीज अन-पायथनिक कक्षा नाम के लिए लोअरकेस पहचानकर्ता का उपयोग कर रही है। –

+0

@ कार्ड: बेशक आप सही हैं, मैंने इसे बदल दिया :) –

उत्तर

14

आप सभी गिनती पर सही हैं। data_member एक बार बनाया जाएगा, और coo के सभी उदाहरणों के लिए उपलब्ध होगा। अगर कोई उदाहरण इसे संशोधित करता है, तो वह संशोधन अन्य सभी उदाहरणों के लिए दृश्यमान होगा।

def generate_data(): 
    print "Generating" 
    return [1,2,3] 

class coo: 
    data_member = generate_data() 
    def modify(self): 
     self.data_member.append(4) 

    def display(self): 
     print self.data_member 

x = coo() 
y = coo() 
y.modify() 
x.display() 

# Output: 
# Generating 
# [1, 2, 3, 4] 
+0

कक्षा के बाहर कुछ भी क्या है? –

+0

@ ओमेगा: यह वही है - बस मॉड्यूल स्कोप पर "module_data = gener_data()" कहें। – RichieHindle

6

बयान data_member = generate_data() केवल एक बार निष्पादित किया जाएगा, class coo: ... निष्पादित किया जाता है जब:

यहाँ एक उदाहरण है कि यह सभी को दर्शाता है, इसके उत्पादन के साथ अंत में दिखाया गया है। अधिकांश मामलों में कक्षा विवरण मॉड्यूल स्तर पर होते हैं और मॉड्यूल आयात होने पर निष्पादित होते हैं। तो data_member = generate_data() केवल एक बार निष्पादित किया जाएगा जब आप पहली बार कक्षा coo के साथ मॉड्यूल आयात करते हैं।

coo कक्षा के सभी उदाहरण data_member साझा करेंगे और लिखकर इसे एक्सेस कर सकते हैं। पर किए गए किसी भी बदलाव को तुरंत coo उदाहरण से देखा जाएगा। एक उदाहरण के पास data_member विशेषता हो सकती है। यह विशेषता self.data_member = ... टाइप करके सेट की जा सकती है और केवल उस उदाहरण के लिए दिखाई देगी। "स्थिर" data_member को अभी भी टाइप करके एक्सेस किया जा सकता है। उदाहरण

self.data_member.append('foo') 

तो संशोधन द्वारा देखा जाता है के लिए एक उदाहरण वस्तु खुद को संशोधित करता है, तो: -

13

दूसरों जवाब दे दिया है के रूप में तुम सही हो मैं एक और बात जोड़ने के बारे में पता होना करने के लिए करेंगे बाकी के उदाहरण। लेकिन यदि आप

self.data_member = new_object 

फिर एक नया उदाहरण सदस्य जो वर्ग के सदस्य को ओवरराइड करता है और कहा कि उदाहरण के लिए, नहीं दूसरों के लिए ही दिखाई दे रहा है बनाई गई है है। अंतर स्पॉट करना हमेशा आसान नहीं होता है, उदाहरण के लिए self.data_member += 'foo' बनाम self.data_member = self.data_member + 'foo'

इससे बचने के लिए आपको शायद ऑब्जेक्ट को (self के माध्यम से नहीं) के रूप में संदर्भित करना चाहिए।

+0

+1 कई अच्छे अंक हैं, विशेष रूप से एक उदाहरण विशेषता के बजाय कक्षा विशेषता के रूप में संदर्भित करने के बारे में। –

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