2012-04-25 12 views
13

अजगर में, वर्ग चर कि वर्ग उदाहरण के माध्यम से पहुँचा जा सकता है:पायथन: उदाहरण के माध्यम से पहुंच वर्ग चर

>>> class A(object): 
...  x = 4 
... 
>>> a = A() 
>>> a.x 
4 

यह दिखाने के लिए कि a.x वास्तव में, A.x का संकल्प लिया निर्माण के दौरान एक उदाहरण में प्रतिलिपि नहीं है आसान है:

>>> A.x = 5 
>>> a.x 
5 

तथ्य यह है कि इस व्यवहार well known है और व्यापक रूप से इस्तेमाल के बावजूद, मैं कोई निश्चित प्रलेखन यह कवर नहीं पा सके। निकटतम मैं अजगर डॉक्स में मिल सकता है section on classes था:

class MyClass: 
    """A simple example class""" 
    i = 12345 
    def f(self): 
     return 'hello world' 

[स्निप]

... परिभाषा के अनुसार, कि समारोह वस्तुओं रहे हैं एक वर्ग के सभी विशेषताओं इसके उदाहरणों में से इसी तरीकों परिभाषित करते हैं। तो हमारे उदाहरण में, x.f एक वैध विधि संदर्भ है, क्योंकि MyClass.f एक फ़ंक्शन है, लेकिन x.i नहीं है, क्योंकि MyClass.i नहीं है। ...

हालांकि, यह हिस्सा विशेष रूप से विधियों के बारे में बात करता है, इसलिए यह सामान्य मामले के लिए प्रासंगिक नहीं है।

मेरा सवाल है, क्या यह प्रलेखित है? क्या मैं इस व्यवहार पर भरोसा कर सकता हूं?

उत्तर

13

Refs http://docs.python.org/reference/datamodel.html

में Classes और Class instances भागों एक वर्ग एक namespace एक शब्दकोश वस्तु द्वारा कार्यान्वित है। कक्षा विशेषता संदर्भों का अनुवाद इस शब्दकोश में लुकअप में किया गया है, उदाहरण के लिए, सीएक्स का अनुवाद सी .__ dict __ ["x"] में किया गया है (हालांकि विशेष रूप से नए शैली के वर्गों के लिए कई हुक हैं जो विशेषताओं को ढूंढने के अन्य साधनों की अनुमति देते हैं)

कक्षा वर्ग को कॉल करके एक वर्ग उदाहरण बनाया गया है (ऊपर देखें)। क्लास इंस्टेंस में एक नामस्थान को एक शब्दकोश के रूप में लागू किया गया है जो है, जिसमें पहली जगह विशेषता संदर्भ खोजे जाते हैं। जब विशेषता वहां नहीं मिलती है, और इंस्टेंस की कक्षा में उस नाम से विशेषता है, तो खोज विशेषताओं के साथ जारी है।

आम तौर पर, यह उपयोग ठीक है, विशेष रूप से वर्णित विशेष मामलों को छोड़कर "नए शैली के वर्गों में कई हुक हैं जो विशेषताओं को ढूंढने के अन्य साधनों की अनुमति देते हैं"।

7

न केवल आप इस व्यवहार पर भरोसा कर सकते हैं, आप लगातार करते हैं।

विधियों के बारे में सोचें। एक विधि केवल एक समारोह है जिसे कक्षा विशेषता बना दी गई है। फिर आप इसे उदाहरण पर देखते हैं।

>>> def foo(self, x): 
...  print "foo:", self, x 
... 
>>> class C(object): 
...  method = foo # What a weird way to write this! But perhaps illustrative? 
... 
>>> C().method("hello") 
foo: <__main__.C object at 0xadad50> hello 

कार्यों की तरह वस्तुओं के मामले में, यह एक सादे देखने नहीं है, लेकिन कुछ जादू self स्वचालित रूप से पारित करने के लिए होता है। आपने अन्य ऑब्जेक्ट्स का उपयोग किया हो जो कि क्लास गुणों के रूप में संग्रहीत किए जाने के लिए हैं और उदाहरण पर देखा गया है; गुण एक उदाहरण हैं (यदि आप इससे परिचित नहीं हैं तो property बिल्टिन देखें।)

ओकेएम नोट्स के रूप में, इस काम को जिस तरह से data model reference में वर्णित किया गया है (जिसमें जादू और विधियों के काम करने वाले जादू के बारे में अधिक जानकारी के बारे में जानकारी शामिल है)। डेटा मॉडल पृष्ठ भाषा संदर्भ का अब तक का सबसे उपयोगी हिस्सा है; इसमें लगभग सभी __foo__ विधियों और नामों के बारे में अन्य चीजों के दस्तावेज भी शामिल हैं।

+0

+1 विधियों के नए दृश्य के लिए +1, लेकिन पिछले कोड में मैंने जो कोड लिखा है, अब मुझे वीडर और अधिक भंगुर दिखता है; उसके लिए धन्यवाद :-/ – 0xc0de

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