2012-05-19 9 views
5

के सभी परिवर्तनों का पता लगाता है मेरे पास दो संपत्तियां हैं जिनमें सूचियां हैं। जब भी इस सूची में कोई भी आइटम बदलता है, तो मैं दूसरी सूची को स्वयं अपडेट करना चाहता हूं। इसमें स्टेटमेंट obj.myProp [3] = 5 शामिल है। अभी, यह कथन पूरी सूची प्राप्त करने के लिए गेटर फ़ंक्शन को कॉल करता है, सूची से तीसरा आइटम प्राप्त करता है, और इसे 5 पर सेट करता है। मेरीप्रॉप सूची बदल दी जाती है, लेकिन दूसरी सूची कभी अपडेट नहीं होती है।पायथन: एक संपत्ति और एक सेटर फ़ंक्शन के साथ कैसे है जो

यहाँ मेरी कोड

class grid(object): 

    def __init__(self,width=0,height=0): 

     #make self._rows a multi demensional array 
     #with it's size width*height 
     self._rows=[ [None]*height for i in xrange(width) ] 
     #make self._columns a multi demensional array 
     #with it's size height*width 
     self._columns=[ [None]*width for i in xrange(height) ] 

    @property 
    def rows(self):#getting the rows of the array 
     return self._rows 
    @rows.setter 
    def rows(self,value):#when the rows are changed, the collumns are updated. 
     self._rows=value 
     self._columns=self._flip(value) 

    @property 
    def columns(self):#getting the columns of the array 
     return self._columns 
    @columns.setter 
    def columns(self,value):#when the columns are changed, the rows are updated 
     self._columns=value 
     self._rows=self._flip(value) 

    @staticmethod 
    def _flip(args):#this flips the array 
     ans=[ [None]*len(args) for i in xrange(len(args[0])) ] 
     for x in range(len(args)): 
      for y in range(len(args[0])): 
       ans[y][x] = args[x][y] 
     return ans 

है और यहाँ एक उदाहरण रन है।

>>> foo=grid(3,2) 
>>> foo.rows 
[[None, None], [None, None], [None, None]] 
>>> foo.columns 
[[None, None, None], [None, None, None]] 
>>> foo.rows=[[1,2,3],[10,20,30]] 
>>> foo.rows 
[[1, 2, 3], [10, 20, 30]] 
>>> foo.columns 
[[1, 10], [2, 20], [3, 30]] 
>>> foo.rows[0][0]=3 
>>> foo.rows 
[[3, 2, 3], [10, 20, 30]] 
>>> foo.columns 
[[1, 10], [2, 20], [3, 30]] 

अगर आप पिछले तीन लाइनों को देखो, इस जहां वास्तविक समस्या तब होती है है। मैंने sublist का पहला आइटम तीन तक सेट किया है, लेकिन foo.columns ने अपनी सूची में 3 को रखने के लिए कभी भी अपडेट नहीं किया है।

इसलिए संक्षेप में, मैं एक वैरिएबल कैसे बना सकता हूं जो हमेशा एक और चर अद्यतन करता है, भले ही यह सबिटैम बदला जा रहा हो।

मैं अजगर 2.7

उत्तर

5

आपकी समस्या यह है कि आप हमलावर लाइन पर foo.rows की स्थापना नहीं रहे है - आप यह हो रही, और फिर इसे के सदस्यों में से एक को संशोधित कर रहे हैं। यह सेटर को आग नहीं जा रहा है। जिस एपीआई का आप प्रस्ताव दे रहे हैं, आपको उस सूची को वापस करने की आवश्यकता होगी जिसमें गेटर्स और सेटर्स संलग्न हैं।

आप पंक्तियों और स्तंभों गुणों का उपयोग नहीं करने के लिए प्रविष्टियों स्थापित करने के लिए बेहतर कर चाहते हैं, और एक __getiten__ विधि इस तरह जोड़ें:

class grid(object): 

    def __init__(self, width=0, height=0): 
     self._data = [None] * width * height; 
     self.width = width 
     self.height = height 

    def __getitem__(self, pos): 
     if type(pos) != tuple or len(pos) != 2: 
      raise IndexError('Index must be a tuple of length 2') 
     x, y = pos 
     if 0 <= x < self.width and 0 <= y < self.height: 
      return self._data[x + self.width * y] 
     else: 
      raise IndexError('Grid index out of range') 

    def __setitem__(self, pos, value): 
     if type(pos) != tuple or len(pos) != 2: 
      raise IndexError('Index must be a tuple of length 2') 
     x, y = pos 
     if 0 <= x < self.width and 0 <= y < self.height: 
      self._data[x + self.width * y] = value 
     else: 
      raise IndexError('Grid index out of range') 

    @property 
    def columns(self): 
     return [ 
      [self[x, y] for x in xrange(self.width)] 
      for y in xrange(self.height) 
     ] 

    @property 
    def rows(self): 
     return [ 
      [self[x, y] for y in xrange(self.height)] 
      for x in xrange(self.width) 
     ] 

टूटी हुई लाइन तो हो जाता है:

foo[0, 0] = 3 
2

उपयोग कर रहा हूँ, तो आप बस अपने rows या columns सूची लौटने के लिए, तो आप क्या होता है जब एक आइटम परिवर्तित हो जाता है के बारे में कोई नियंत्रण नहीं करेंगे।

एक संभावना सीधे सूचियों को प्राप्त/सेट करने के लिए गुण प्रदान नहीं करेगी, लेकिन स्थिति x/y पर किसी आइटम के लिए सेटर्स/गेटर्स प्रदान करें।

एक अच्छा संस्करण __setitem__/__getitem__ है और उन्हें एक टपल स्वीकार करने के लिए, इस तरह आप foo[x,y] और foo[x,y] = bar का उपयोग कर तत्वों acces सकता है किया जाएगा।

एक अन्य तरीका सूची के चारों ओर एक रैपर वापस करने के लिए होगा जो एक तत्व को बदलता है, लेकिन फिर आपको प्रत्येक नेस्टेड सूची के लिए भी ऐसा करना होगा।

0

मैं अनुशंसा करते हैं कि आप numpy का उपयोग कर देखें। विशेष रूप से, transpose विधि अक्षरों के साथ अंतर्निहित मैट्रिक्स का "दृश्य" देता है, जिसका अर्थ है कि यदि आप एक को बदलते हैं तो दूसरा बदल जाएगा।

यदि यह आपकी आवश्यकताओं के अनुरूप नहीं है, तो मैं जिस एपीआई को आप काम करना चाहता हूं उसे बनाने के लिए एकमात्र तरीका है "पंक्तियों" और "कॉलम" विधियों को कस्टम "दृश्य ऑब्जेक्ट" वापस करने के लिए परिभाषित करना है जो नहीं करते हैं वास्तव में डेटा स्टोर करते हैं, लेकिन यह ग्रिड ऑब्जेक्ट में कुछ निजी (साझा) डेटा को वापस इंगित करता है। ये सूची-जैसी हो सकती है, लेकिन कुछ संचालन का समर्थन नहीं करेगी (उदा।, संलग्न करें या साफ़ करें)।

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