2012-02-07 9 views
6

अवलोकन: - कोई गुण o पर निर्धारित करते हैं, o.inner पर सेट किया जाना चाहिए के लिए एक हीनेस्टेड वस्तुओं और setattr और getattr (उस समय हाँ, यह है)

class Inner(object): 
    def __init__(self, x): 
     self.x = x 

class Outer(object): 
    def __init__(self, z): 
     self.inner = Inner(z) 

o = Outer(10) 

अब, मैं बाहरी वस्तु पारदर्शी रूप से व्यवहार करने के लिए चाहते हैं पढ़ना: o.something वास्तव में, o.inner.sommething का मान वापस करना चाहिए। प्रॉक्सी या रिले की तरह।

def __getattr__(self, item): 
    return getattr(self, item) 

मैं __setattr__ कैसे संभाल होगा:

__getattr__Outer के लिए सरल & काम करता है? मैं ऐसी किसी भी चीज़ के साथ नहीं आ सकता था जिसने रिकर्सन त्रुटि नहीं की और मुझे खुद से नफरत नहीं हुई।

या अवधारणा स्वयं ही त्रुटिपूर्ण है? यह वास्तव में, वर्तमान @classmethods सौंदर्य की दृष्टि से नहीं खेला था आईडीई उन के अंदर खो जाना चाहते हैं उल्लेख करने के लिए नहीं - -

(एक और दृष्टिकोण मैंने कोशिश की OuterInner का एक उपवर्ग बना रही थी। कुछ विशेषताओं को हल करने में सक्षम नहीं है कि छोड़ दो अभी के लिए, शायद?)

+0

क्या आपका मतलब 'self.inner = Inner (z) 'था? साथ ही, क्या आपकी Getattr विधि इनर() से डेटा लौटाती है? जिस तरह से लिखा गया है, ऐसा लगता है कि यह सिर्फ बाहरी संदर्भ देगा। – gfortune

+0

हां - यह वापस आता है। दोनों फिक्स्ड, धन्यवाद! – ntl0ve

उत्तर

7

मुश्किल हिस्सा innerOuter कक्षा की विशेषता को सही ढंग से सेट कर रहा है। आप क्या कर सकते (Outer के आधार वर्ग) फोन object की __setattribute__ विधि है:

class Inner(object): 
    def __init__(self, x): 
     self.x = x 

class Outer(object):  
    def __init__(self, z): 
     object.__setattr__(self, 'inner', Inner(z)) 

    def __getattr__(self, name): 
     return getattr(self.inner, name) 

    def __setattr__(self, name, value): 
     return setattr(self.inner, name, value) 

अब, यह सही ढंग से काम करता है:

o = Outer(10) 
print o.x  # 10 
print o.inner.x # 10 
o.g = 3 
print o.g  # 3 
print o.inner.g # 3 

हालांकि, यह करने के लिए स्पष्ट नहीं है मेरी तुम क्यों नहीं इस मामले में विरासत का उपयोग करना चाहते हैं। यह Inner से प्राप्त होने के लिए अधिक प्राकृतिक और पायथनिक लगता है।

+0

और कारण प्रिंट (ओ.इनर) काम करता है क्योंकि ओ.इनर पहले से मौजूद है इसलिए यह '__getattr__' को कॉल नहीं करता है और o.inner.inner को वापस करने का प्रयास करता है, सही? यह स्पष्ट नहीं है कि '__getattr__' उन मामलों में नहीं बुलाया जाता है जहां अनुरोधित आइटम प्रश्न में ऑब्जेक्ट के हिस्से के रूप में पहले से मौजूद है। – gfortune

+0

@gfortune, हाँ; अधिक देखने के लिए [यह प्रश्न] (http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute-in-python)। – senderle

+0

हां, देखें [\ _ \ _ getattr \ _ \ _] (http://docs.python.org/reference/datamodel.html#object.__getattr__) दस्तावेज़ – jterrace

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