2010-08-08 32 views
41
class Example(object): 
    def the_example(self): 
     itsProblem = "problem" 

theExample = Example() 
print(theExample.itsProblem) 

मैं कक्षा के चर का उपयोग कैसे करूं? मैंने इस परिभाषा को जोड़ने का प्रयास किया है:पायथन में कक्षा के सदस्य चर का उपयोग करना?

def return_itsProblem(self): 
    return itsProblem 

फिर भी, यह भी विफल रहता है।

+0

शीर्षक संपादित, वास्तव में के बारे में वर्ग "स्थिर" चर प्रश्न: http://stackoverflow.com/questions/707380/in-python-how-can-i-access- स्थैतिक-वर्ग-चर-इन-क्लास-विधियों –

उत्तर

80

जवाब है, कुछ शब्दों में

में अपने उदाहरण के लिए, itsProblem एक स्थानीय चर है।

सेट करने और इंस्टेंस चर प्राप्त करने के लिए आपको self का उपयोग करना होगा। आप इसे __init__ विधि में सेट कर सकते हैं। फिर अपने कोड होगा:

class Example(object): 
    def __init__(self): 
     self.itsProblem = "problem" 


theExample = Example() 
print(theExample.itsProblem) 

लेकिन अगर आप एक सच्चे वर्ग चर चाहते हैं, तो वर्ग के नाम सीधे का उपयोग करें:

class Example(object): 
    itsProblem = "problem" 


theExample = Example() 
print(theExample.itsProblem) 
print (Example.itsProblem) 

लेकिन इस एक के साथ सावधान रहना, के रूप में theExample.itsProblem स्वचालित रूप से होना करने के लिए सेट कर दिया जाता Example.itsProblem के बराबर, लेकिन यह बिल्कुल वैरिएबल नहीं है और इसे स्वतंत्र रूप से बदला जा सकता है।

कुछ स्पष्टीकरण

अजगर में, चर कार डायनामिक रूप से तैयार किया। कि वास्तव में क्या आप पिछले उदाहरण के साथ क्या है

class Example(object): 
    pass 

Example.itsProblem = "problem" 

e = Example() 
e.itsSecondProblem = "problem" 

print Example.itsProblem == e.itsSecondProblem 

प्रिंटों

सच

इसलिए,: वजह, आप निम्न कर सकते हैं।

वास्तव में, पायथन में हम selfthis के रूप में उपयोग करते हैं, लेकिन यह उससे थोड़ा अधिक है। Self किसी ऑब्जेक्ट विधि का पहला तर्क है क्योंकि पहला तर्क हमेशा वस्तु संदर्भ होता है। यह स्वचालित है, चाहे आप इसे स्वयं कहते हैं या नहीं।

आप कर सकते हैं इसका मतलब है:

class Example(object): 
    def __init__(self): 
     self.itsProblem = "problem" 


theExample = Example() 
print(theExample.itsProblem) 

या:

class Example(object): 
    def __init__(my_super_self): 
     my_super_self.itsProblem = "problem" 


theExample = Example() 
print(theExample.itsProblem) 

यह बिल्कुल वैसा ही है। किसी ऑब्जेक्ट विधि का पहला तर्क वर्तमान वस्तु है, हम इसे केवल self को एक सम्मेलन के रूप में कहते हैं। और आप इस ऑब्जेक्ट में केवल एक चर जोड़ते हैं, वैसे ही आप इसे बाहर से भी करेंगे।

अब कक्षा चर के बारे में।

जब आप ऐसा करेंगे:

class Example(object): 
    itsProblem = "problem" 


theExample = Example() 
print(theExample.itsProblem) 

आप देखेंगे हम पहले एक वर्ग चर निर्धारित करते हैं, तो हम एक वस्तु (उदाहरण) अलग-अलग एक्सेस करते हैं। हमने इस ऑब्जेक्ट वैरिएबल को कभी भी सेट नहीं किया है लेकिन यह काम करता है, यह कैसे संभव है?

ठीक है, पाइथन पहले ऑब्जेक्ट वैरिएबल प्राप्त करने का प्रयास करता है, लेकिन यदि यह नहीं मिल पाता है, तो आपको क्लास वैरिएबल देगा। चेतावनी: कक्षा चर को उदाहरणों के बीच साझा किया जाता है, और ऑब्जेक्ट चर नहीं है।

एक निष्कर्ष के रूप में, कभी भी चर वैरिएबल को डिफ़ॉल्ट मान सेट करने के लिए कक्षा चर का उपयोग न करें। इसके लिए __init__ का उपयोग करें।

आखिरकार, आप सीखेंगे कि पायथन कक्षाएं उदाहरण हैं और इसलिए स्वयं को ऑब्जेक्ट करती हैं, जो उपरोक्त को समझने के लिए नई अंतर्दृष्टि प्रदान करती हैं। एक बार जब आप इसे महसूस कर लेंगे, तो वापस आएं और बाद में इसे पढ़ें।

+0

+1। यही वह है। – Abizern

+0

आप कहते हैं: "theExample.itsProblem स्वचालित रूप से example.itsProblem के बराबर सेट हो जाता है, लेकिन यह बिल्कुल वैरिएबल नहीं है और इसे स्वतंत्र रूप से बदला जा सकता है" - लेकिन यह बिल्कुल सही नहीं है, और आपका वाक्यांश भ्रामक है। मुझे भरोसा है कि आप जानते हैं कि वहां क्या हो रहा है, इसलिए मैं सुझाव देता हूं कि: "यह एक ही वैरिएबल _is_ है, लेकिन इसे प्रत्येक ऑब्जेक्ट के लिए स्वतंत्र रूप से पुनर्निर्मित किया जा सकता है"। – jsbueno

+0

हां, लेकिन बाध्यकारी किसी अन्य प्रोग्रामिंग भाषा जैसे जावा या सी (जैसा कि मुझे लगता है कि ओपी है) के लिए एक अवधारणा है जो पूरी तरह से अज्ञात है। तब मैं समझूंगा कि बाध्यकारी क्या है, फिर देर से बाध्यकारी, फिर परिवर्तनीय वस्तुओं पर संदर्भ के साथ समस्या। यह बहुत लंबा होगा। मुझे लगता है कि कभी-कभी आपको समझ की वेदी पर सटीकता बलि देना चाहिए। –

8

आप एक स्थानीय चर घोषित कर रहे हैं, क्लास चर नहीं। एक उदाहरण चर (विशेषता) सेट करने के लिए, का उपयोग

class Example(object): 
    def the_example(self): 
     self.itsProblem = "problem" # <-- remember the 'self.' 

theExample = Example() 
theExample.the_example() 
print(theExample.itsProblem) 

एक class variable (उर्फ स्थिर सदस्य) सेट करने के लिए उपयोग करें

class Example(object): 
    def the_example(self): 
     Example.itsProblem = "problem" 
     # or, type(self).itsProblem = "problem" 
     # depending what you want to do when the class is derived. 
+0

सिवाय इसके कि कक्षा चर * एक बार * कक्षा-स्तर * घोषित किए गए हैं। आपका तरीका हर इंस्टीट्यूशन पर इसे रीसेट कर देगा, यह वास्तव में वह नहीं है जो आप चाहते हैं। Http://stackoverflow.com/questions/2709821/python-self- स्पष्ट स्वयं के पीछे तर्क के लिए भी देखें। __init__ के लिए – delnan

0

आप एक उदाहरण समारोह (यानी एक ही है कि स्वयं को पारित कर दिया जाता है) आप स्वयं का उपयोग वर्ग का उपयोग कर self.__ __class__ __

बवंडर नीचे कोड में उदाहरण के लिए अनुरोध प्राप्त संभालने के लिए एक उदाहरण बनाता है के लिए एक संदर्भ पाने के लिए कर सकता है, लेकिन हम get_handler कक्षा को पकड़ सकते हैं और एक दंगा ग्राहक को पकड़ने के लिए इसका उपयोग कर सकते हैं, इसलिए हमें प्रत्येक अनुरोध के लिए एक बनाने की आवश्यकता नहीं है।

import tornado.web 
import riak 

class get_handler(tornado.web.requestHandler): 
    riak_client = None 

def post(self): 
    cls = self.__class__ 
    if cls.riak_client is None: 
     cls.riak_client = riak.RiakClient(pb_port=8087, protocol='pbc') 
    # Additional code to send response to the request ... 
0

नीचे दिए गए उदाहरण की तरह वापसी विवरण लागू करें! आपको अच्छा होना चाहिए। मुझे आशा है कि यह किसी को मदद करता है ...

class Example(object): 
     def the_example(self): 
     itsProblem = "problem" 
     return itsProblem 

    theExample = Example() 
    print theExample.the_example() 
+0

आपको अपना कोड इंडेंटेशन ठीक करना चाहिए। इस प्रश्न के बेहतर उत्तर भी हैं और आपका उत्तर उन उत्तरों पर एक बुनियादी भिन्नता है, वैकल्पिक समाधान नहीं ... –

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