2012-10-23 16 views
9

तो मेरे पास एक कक्षा है, जिसे मैं स्थानीय नामस्थान के रूप में उपयोग कर रहा हूं। मेरे पास कक्षा में कुछ स्थिर कार्य हैं, लेकिन वे कक्षा स्कोप चर का उपयोग नहीं कर सकते हैं। ऐसा क्यों है?स्वयं के बिना कक्षा-स्कोप चर का उपयोग कैसे करें?

class Foo: 
    foo_string = "I am a foo" 

    @staticmethod 
    def foo(): 
     print foo_string 

>>> Foo.foo() 
    [Stack Trace] 
    NameError: global name 'foo_string' is not defined 

किसी भी विचार?

उत्तर

10

अजगर वहाँ यह करने के लिए दो तरीके हैं चलो यह नहीं है कि वर्ग चर गुंजाइश में इस तरह से गिर जाते हैं, पहले एक वर्ग विधि का उपयोग करने के लिए है:

@classmethod 
def foo(cls): 
    print(cls.foo_string) 

कौन सा मैं तर्क है सबसे अच्छा समाधान है।

दूसरा नाम से उपयोग करने के लिए है:

@staticmethod 
def foo(): 
    print(Foo.foo_string) 

ध्यान दें है सामान्य रूप में है कि, के रूप में एक namespace यह करने के लिए सबसे अच्छा तरीका नहीं है एक वर्ग का उपयोग कर, बस शीर्ष स्तर के कार्यों के साथ एक मॉड्यूल का उपयोग इसके बजाए, जैसा कि आप चाहते हैं उतना ही कार्य करता है।

इस तरह के स्कोपिंग की कमी का कारण मुख्य रूप से पायथन की गतिशील प्रकृति के कारण है, जब आप कक्षा में कोई फ़ंक्शन डालते हैं तो यह कैसे काम करेगा? इसे सशर्त रूप से इसमें विशेष व्यवहार जोड़ा जाना चाहिए, जो कार्यान्वित करने और संभावित रूप से नाजुक होने के लिए बेहद अजीब होगा। यह चीजों को स्पष्ट रूप से स्पष्ट रखने में भी मदद करता है - यह स्पष्ट है कि एक स्थानीय चर के विपरीत वर्ग चर क्या है। नामस्थान के रूप में मॉड्यूल का उपयोग करने के लिए

+0

+1। –

+1

3.x कक्षा संकलन में, '__class__' संदर्भित कोई भी कार्य बंद हो जाता है। '__class__' के लिए कक्ष नए' __build_class__' अंतर्निर्मित फ़ंक्शन द्वारा सेट किया गया है। 'staticmethod' को 3.x से हटा दिया गया है, इसलिए कक्षा में परिभाषित एक सादा फ़ंक्शन' __class__' का संदर्भ दे सकता है। – eryksun

+0

@DanielRoseman मुख्य कारण है कि मैं एक नामस्थान के रूप में एक मॉड्यूल का उपयोग नहीं कर रहा हूं यह है कि मैंने नेस्टेड नेमस्पेस के लिए कक्षाएं घोंसला की हैं, और इतनी छोटी फाइलों को प्रबंधित करने के लिए यह अनावश्यक है। – Lucretiel