python - How to explain the 'weird' results about __getattribute__, __getattr__? -


  वर्ग बी (वस्तु): "" "नई शैली वर्ग" "def __getattribute __ (स्वयं, नाम): प्रिंट 'नामक __getattr__' डीईएफ़ __setattr __ (स्वयं, नाम, मूल्य):: प्रिंट 'नामक __setattr__' अगर में [नाम 'प्रिंट वापसी सुपर (बी, आत्म) डीईएफ़ __getattr __ (स्वयं, नाम)' नामक __getattribute__ '.__ getAttribute __ (नाम) एट्रिब्यूट एंटर ('एट्रिब्यूट नाम अमान्य!') और: वापसी सुपर (बी, सेल्फ) .__ सेटैट्र __ (नाम, मान)   

बी क्लास के रूप में परिभाषित किया गया है: इसके बाद, मैं __ getattr __, __ getattribute __ :

  b = B () सेटैट्र (बी, 'परीक्षण', 100) प्रिंट बी के बारे में कुछ परीक्षण करने की कोशिश करता हूं।  <: __dict__ ख .__ getAttribute __ ( '__ dict__') प्रिंट ख .__ getattr __ ( '__ dict__') प्रिंट getattr (ख, '__dict__')   

अंत में परिणाम है कि है प्रिंट pre> __ getattribute__ { 'परीक्षण': 100} कहा जाता __getattribute__ __getattribute__ बुलाया { 'परीक्षण': 100} कहा जाता __getattribute__ बुलाया __getattr__ कोई नहीं __getattribute__ { 'परीक्षण': 100} कहा जाता है कहा जाता है

यहाँ मेरे प्रश्न आते हैं:

1. प्रिंट b .__ getattribute __ ('__ निर्देश __') जिसे __ getattribute __ कहा जाता है दो बार, क्यों?

2. प्रिंट ख .__ getattr __ ( '__ dict __') कहा जाता है __ getAttribute __ पहले और उसके बाद कहा जाता है __ getattr __ अगले? क्यों वापस कोई भी नहीं?

उपरोक्त परिणाम मुझे इतने अजीब लगते हैं। मैं सच में नहीं समझता कि ये तरीकों कैसे काम करती हैं। कोई सलाह या सुझावों की सराहना की जाती है। धन्यवाद!

  1. पहले __ getattribute __ कॉल किया जाता है जब आप b .__ getattribute __ करते हैं आप __ getattribute __ नाम की विशेषता प्राप्त करना चाहते हैं (हाँ, मुझे पता है कि यह सुंदर रंग है)। जब आप __ getattribute __ नाम की विशेषता का अनुरोध करते हैं, तब __ getattribute __ कहा जाता है और आपको परिणाम में __ getattribute __ विधि प्राप्त होती है तो फिर तुम सिर्फ फोन __ getAttribute __ विधि - यहाँ की __ getAttribute __

  2. <कोड> ख .__ getattr __ कॉल __ getattribute __ विशेषता को पाने के लिए __ getattr __ (हाँ, मुझे पता है)। आपको बदले में __ getattr __ विधि प्राप्त होती है। फिर आप __ getattr __ विधि को कॉल करते हैं। यह स्पष्ट रूप से कुछ भी वापस नहीं करता है जिसका मतलब है कि यह कोई भी कोई भी रिटर्न नहीं देता है।

    यह देखने का सरल संस्करण होता है जब आप some_obj_of_class_B.some_method () :

    • __ getattribute __ को some_method नामक विशेषता प्राप्त करने के लिए कहा जाता है __ getattribute __ प्रिंट 'मुझे बुलाया गया था!' और प्रतिनिधियों वस्तु .__ getAttribute __ (जो, मुझे लगता है, some_obj_of_class_B के लिए __ dict __ की जांच करता है करने के लिए अपनी नौकरी, अपने वर्ग __ dict __ , आधार वर्ग __ dict__ की जांच करता है उम्मीदवार वस्तु .__ getattribute __ रिटर्न some_method (जो उम्मीद है कि एक समारोह या अधिक सटीक रूप से एक बाध्य विधि है)
    • इस कार्य / बाध्य विधि को कहा जाता है। आपके मामले में एक निश्चित विधि __ getattribute __ ही है, यही कारण है कि इसे दो बार कहा जाता है।

Comments

Popular posts from this blog

ios - Adding an SKSpriteNode to SKScene from a child SKSpriteNode -

Matlab transpose a table vector -

c# - Textbox not clickable but editable -