5

अजगर हमें, उदाहरण/वर्ग विशेषता पर कई संभावनाएं प्रदान करता है उदाहरण के लिए:पाइथन विशेषता क्या प्राप्त करती है और ऑर्डर सेट करती है?

  1. सीधी पहुँच a.foo
  2. भीतरी dict:

    class A(object): 
        def __init__(self): 
         self.foo = "hello" 
    
    a = A() 
    

    पहुँच के लिए कई तरीके हैं/self.foo का मूल्य बदल a.__dict__['foo']

  3. a.__get__ और a.__set__ प्राप्त करें और सेट करें, निश्चित रूप से दो पूर्व-परिभाषित विधियां हैं।
  4. getAttribute a.__getattribute__
  5. __getattr__ और __setattr__
  6. शायद अधिक।

स्रोत कोड पढ़ने के दौरान, मैं हमेशा उनके अंतिम पहुंच आदेश का खो गया हूं? जब मैं a.foo का उपयोग करता हूं, तो मुझे कैसे पता चलेगा कि वास्तव में कौन सी विधि/विशेषता कहा जाएगा?

+1

1. 'foo' एक * आवृत्ति विशेषता * है, न कि क्लास विशेषता। 2. चूंकि यह '@ संपत्ति' (या अन्य वर्णनकर्ता नहीं)' __get__' और '__set__' शामिल नहीं होगा। – jonrsharpe

+0

उदाहरण के लिए '__getattr__' बनाम' __getattribute__', देखें http://stackoverflow.com/q/3278077/3001761 – jonrsharpe

उत्तर

6

bar = a.foo ...

  1. invokes a.__getattribute__('foo')
  2. जो डिफ़ॉल्ट रूप से बदले में a.__dict__['foo']
  3. ऊपर लग रहा है या invokes foo के .__get__() अगर A पर परिभाषित किया।

लौटाया गया मूल्य bar पर सौंपा जाएगा।


a.foo = bar ...

  1. invokes a.__getattribute__('foo')
  2. जो डिफ़ॉल्ट रूप से बदले में a.__dict__['foo']
  3. ऊपर लग रहा है या invokes foo के .__set__(bar) अगर ए
+0

अच्छी तरह से समझाया गया। महान। – Fawzan

+0

यह काफी सटीक नहीं है; '__get__' और' __set__' वर्णनकर्ताओं के लिए हैं, जो * कक्षा * पर संग्रहीत हैं, इसलिए 'a .__ dict__' में नहीं मिलेगा। – jonrsharpe

+0

@jonrsharpe अधिक तकनीकी रूप से सही होने के लिए tweaked। – Amber

1

पर परिभाषित मुझे this great post वें पता चला ऑब्जेक्ट/क्लास एट्रिब्यूट लुकअप पर विस्तृत स्पष्टीकरण है।

वस्तु विशेषता देखने के लिए:

कक्षा मान लिया जाये कि वर्ग है और उदाहरण कक्षा का एक उदाहरण है, का मूल्यांकन instance.foobar मोटे तौर पर इस के बराबर:

  • कॉल कक्षा के लिए प्रकार स्लॉट। getattribute (tp_getattro)। डिफ़ॉल्ट यह करता है:
    • कक्षा करता है। dict एक foobar आइटम है जो एक डेटा वर्णनकर्ता है?
      • यदि हां, कक्षा का परिणाम वापस कर दें। dict ['foobar']। (उदाहरण, कक्षा) प्राप्त करें।
    • उदाहरण है। dict इसमें एक foobar आइटम है?
      • यदि हां, तो वापसी उदाहरण। dict ['foobar']।
    • कक्षा करता है। dict एक foobar आइटम है जो एक डेटा वर्णनकर्ता नहीं है [9]?
      • यदि हां, कक्षा का परिणाम वापस कर दें। dict ['foobar']। (उदाहरण, क्लास) प्राप्त करें। [6]
  • विशेषता अभी भी नहीं मिला था, तो और वहाँ एक वर्ग है। getattr, कक्षा कॉल करें। getattr ('foobar')।

इस के लिए एक सचित्र छवि नहीं है:

enter image description here

कृपया बाहर मूल ब्लॉग जाँच करते हैं रुचि रखते अगर जो अजगर वर्ग पर एक बकाया स्पष्टीकरण देता है, देखने, और metaclass जोड़कर देखते हैं।

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