2012-10-21 17 views
7

मैंने निम्नलिखित रैपर वर्ग लिखा है। मैं __setattr__ को परिभाषित करना चाहता हूं जैसे कि यह सभी विशेषताओं को लिपटे वर्ग में रीडायरेक्ट करता है। हालांकि, यह मुझे रैपर वर्ग शुरू करने से रोकता है। इसे ठीक करने का कोई शानदार तरीका?आरंभ करने के बाद तक `__setattr__` को अक्षम करने का क्लीन तरीका

class Wrapper: 
    def __init__(self, value): 
     # How to use the default '__setattr__' inside '__init__'? 
     self.value = value 

    def __setattr__(self, name, value): 
     setattr(self.value, name, value) 
+0

क्या 'Wrapper' लपेट करता है? यह 'ऑब्जेक्ट' का उत्तराधिकारी क्यों नहीं है? –

+0

@ टिचोड्रोमा यह कुछ भी लपेटता है। मैं इसे एक जीयूआई आवेदन में उपयोग कर रहा हूँ; जब संलग्न वस्तु संशोधित होती है तो रैपर श्रोताओं को सूचित करता है। यह 'ऑब्जेक्ट' से प्राप्त नहीं होता है क्योंकि मैं केवल पायथन 3. –

उत्तर

8

आप सभी कार्य, जो self.value बताए से निर्माता को रोकता है को पकड़ने रहे हैं। आप इंस्टेंस डिक्शनरी तक पहुंचने के लिए self.__dict__ का उपयोग कर सकते हैं। प्रयास करें:

class Wrapper: 
    def __init__(self, value): 
     self.__dict__['value'] = value 

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

एक और तरीका है object.__setattr__ का उपयोग कर:

class Wrapper(object): 
    def __init__(self, value): 
     object.__setattr__(self, 'value', value) 

    def __setattr__(self, name, value): 
     setattr(self.value, name, value) 
+0

नाइस का उपयोग करना चाहता हूं। हालांकि एक प्रश्न: मुझे '__setattr__' के अंदर 'self.__ dict __ [' value ']' का उपयोग क्यों करना चाहिए? –

+0

@ पॉल क्षमा करें, आपको इसकी आवश्यकता नहीं है। मैंने सोचा कि आप '__getattr__' को ओवरराइड कर रहे थे। – quantum

4

एक तरह से __init__ विधि में self.value = value वाक्य रचना को बदले बिना __setattr__ प्रारंभ होने के बाद तक निष्क्रिय करने के लिए here कवर किया जाता है। संक्षेप में, ऑब्जेक्ट में प्रारंभ करने के ज्ञान को एम्बेड करें और इसे __setattr__ विधि में उपयोग करें। अपने Wrapper के लिए:

class Wrapper: 
    __initialized = False 
    def __init__(self, value): 
     self.value = value 
     self.__initialized = True 

    def __setattr__(self, name, value): 
     if self.__initialized: 
      # your __setattr__ implementation here 
     else: 
      object.__setattr__(self, name, value) 
0

__getattr__ के साथ के रूप में अच्छी अधिरोहित ::

class Wrapper: 
    def __init__(self,wrapped): 
     self.__dict__['wrapped'] = wrapped 
    def __setattr__(self,name,value): 
     setattr(self.__dict__['wrapped'],name,value) 
    def __getattr__(self,name): 
     return getattr(self.__dict__['wrapped'],name) 


class A: 
    def __init__(self,a): 
     self.a = a 

wa = Wrapper(A(3)) 
#wa.a == wa.wrapped.a == 3