2010-06-29 10 views
5

मैं कक्षा में एक ध्रुव पर पायथन के @property सजावट का उपयोग करने की कोशिश कर रहा हूं। विचार यह है कि मुझे एक निश्चित मूल्य चाहिए (इसे 'संदेश' कहते हैं) इसे एक्सेस करने के बाद साफ़ किया जाना चाहिए। लेकिन मुझे अंतिम सेट संदेश रखने के लिए एक और मूल्य भी चाहिए (इसे 'last_message' कहें), और इसे तब तक रखें जब तक कि कोई अन्य संदेश सेट न हो जाए। मेरे मन में, इस कोड काम करेगा:डिक्ट्स पर @property सजावट का उपयोग

>>> class A(object): 
...  def __init__(self): 
...    self._b = {"message": "", 
...      "last_message": ""} 
...  @property 
...  def b(self): 
...    b = self._b 
...    self._b["message"] = "" 
...    return b 
...  @b.setter 
...  def b(self, value): 
...    self._b = value 
...    self._b["last_message"] = value["message"] 
... 
>>> 

हालांकि, यह प्रतीत नहीं होता:

>>> a = A() 
>>> a.b["message"] = "hello" 
>>> a.b["message"] 
'' 
>>> a.b["last_message"] 
'' 
>>> 

मुझे यकीन है कि मैं गलत क्या किया है नहीं कर रहा हूँ? ऐसा लगता है कि @property काम नहीं करता है जैसे कि मैं इसे डिक्ट्स पर उम्मीद करता हूं, लेकिन हो सकता है कि मैं कुछ और मूलभूत रूप से गलत कर रहा हूं?

इसके अलावा, मुझे पता है कि मैं कक्षा में व्यक्तिगत मूल्यों का उपयोग कर सकता हूं। लेकिन यह एक वेब अनुप्रयोग में एक सत्र के रूप में लागू किया गया है और मुझे इसे एक नियम होने की आवश्यकता है। मैं या तो यह काम कर सकता हूं, या पूरे सत्र ऑब्जेक्ट को इसे एक निर्देश का नाटक करने के लिए बना सकता हूं, या अलग-अलग चर का उपयोग कर सकता हूं और कोड कोड के बाकी हिस्सों में कार्यशीलता में हैक कर सकता हूं। मैं इसे काम करने के लिए बस इतना मिल जाएगा।

+2

आपको नियमित रूप से 'dict' के बजाय अपने _question_ –

+0

बीटीडब्लू में संपादित करने के बजाय अपने उत्तर को एक नए _ (self-) answer_ में डाल देना चाहिए, आपको [' __slots__ = ['message', 'last_message का उपयोग करने में रुचि हो सकती है '] '] (https://docs.python.org/2/reference/datamodel.html?highlight=slots#__slots__) यदि वे केवल दो (निश्चित) कुंजी हैं। या 'collections.namedtuple' –

उत्तर

9
class MyDict(dict): 
    def __setitem__(self,key,value): 
     if key=='message': 
      dict.__setitem__(self,'message','') 
      dict.__setitem__(self,'last_message',value) 
     else: 
      dict.__setitem__(self,key,value) 

class A(object): 
    def __init__(self): 
      self._b = MyDict({"message": "", 
         "last_message": ""}) 
    @property 
    def b(self): 
     return self._b 

a=A() 
a.b['message']='hello' 
print(a.b['message']) 
# '' 
print(a.b['last_message']) 
# hello 

के रूप में मुझे लगता है कि आप की खोज की है, कारण है कि अपने सेटर से काम नहीं कर रहा था क्योंकि

a.b['message']='hello' 

पहले a.b तक पहुँचता है, जो b कहता है संपत्ति का गेटटर, इसके सेटटर नहीं। गेटटर self._b को वापस देता है। फिर self._b['message']='hello' का कारण है कि dict0 __setitem__ कहा जाता है।

तो समस्या को ठीक करने के लिए, आपको एक विशेष dict (जैसे MyDict) की आवश्यकता है।

+0

की कुंजी को असाइन करने में सक्षम होना धन्यवाद, मैंने एक विशेष निर्देश दिया और अब यह काम कर रहा है। मैंने संपत्तियों को पूरी तरह से गिरा दिया और बस सभी कार्यक्षमताओं को निर्देश में स्थानांतरित कर दिया, हालांकि ('__getitem__' के साथ)। मैं अपना खुद का कोड भी प्रश्न में जोड़ूंगा। –

+1

आप (और @ करसन) को 'सुपर (माईडिक्ट, स्वयं) का उपयोग करना चाहिए। _ Dictit__ __ (कुंजी, मान) '' dict .__ setitem __ (स्वयं, कुंजी, मान) 'आदि के बजाय' (अन्यथा कई पूर्वजों के साथ आपकी उप-वर्गों में भाग लेना चाहिए मुसीबत) –

1

मुझे याद आ रहा है कि आप यहां क्या करने की कोशिश कर रहे हैं, लेकिन क्या इससे आपकी समस्या हल हो जाती है?

class A(object): 
    def __init__(self): 
     self._b = {'message':'', 
        'last_message': ''} 

    @property 
    def b(self): 
     b = self._b.copy() 
     self._b['message'] = '' 
     return b 

    @b.setter 
    def b(self, value): 
     self._b['message'] = value 
     self._b['last_message'] = value 


if __name__ == "__main__": 
    a = A() 
    a.b = "hello" 
    print a.b 
    print a.b 
    print a.b["last_message"] 

$ python dictPropTest.py 
{'last_message': 'hello', 'message': 'hello'} 
{'last_message': 'hello', 'message': ''} 
hello 
+0

को बंद करें, मुझे वास्तव में पता चला है कि एक सेटर की कुंजी को असाइन करना वास्तव में काम नहीं करता है। मैं सोच रहा था कि 'ए.बी. [' संदेश '] = "हैलो" एक सेटर को' संदेश 'कुंजी वाला एक नियम पारित करेगा, लेकिन ऐसा नहीं है। लेकिन मैं वास्तव में क्या चाहता हूं कि एक सेटटर –

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