2013-02-16 56 views
10

मैं एक वर्ग है जो कई विशेषताओं से संबंधित हैं, उदाहरण के लिए: यदि मैं सामान्य रूप से है कि होगा कोई समस्या नहीं एक वस्तु बनानेक्लास ऑब्जेक्ट में, ऑटो अपडेट कैसे करें?

class SomeClass: 
    def __init__(self, n=0): 
     self.list = range(n) 
     self.listsquare = [ x**2 for x in self.list ] 

,

a = SomeClass(10) 

साथ मैं 2 सूचियों मिलेगा, a.list और a.listsquare

अब अगर मैं पहली बार एक खाली वस्तु बनाने के लिए, और यह करने के लिए एक विशेषता प्रदान करना चाहते हैं, मैं अन्य विशेषताओं स्वचालित रूप से अपडेट किया जाना चाहते हैं, उदाहरण के लिए अगर मैं कर

b = SomeClass() 
b.list = range(5,10) 

मैं b.listsquare स्वचालित रूप से होना चाहता हूँ अपडेट किया गया, और अन्य तरीकों के आसपास (b.listsquare असाइन करें और ऑटो अपडेट b.list)। क्या यह संभव है? कक्षा इस के लिए सही विकल्प है?


आप सभी को धन्यवाद, लेकिन मैं सभी अलग-अलग उत्तरों से पूरी तरह से अभिभूत हूं। क्या कोई भी पूरा समाधान दे सकता है ताकि मैं अपना खुद का लिख ​​सकूं?

  1. अगर मैं a = Foo(3) करते हैं, मैं a.length = 3, a.list = [0, 1, 2], a.listsquare = [0, 1, 4]:

    मैं 3 गुण length, list और listsquare ऐसी है कि के साथ एक कक्षा Foo को प्राप्त करना चाहते हैं।

  2. यदि मैं b = Foo().list = [5, 6] करता हूं, तो मुझे b.length = 2, b.listsquare = [25, 36] मिलता है।
  3. यदि मैं c = Foo().listsquare = [4, 9] करता हूं, तो मुझे c.length = 2, c.list = [2, 3] मिलता है।
+2

कोड आप हमें काम नहीं करता दे दिया है। कक्षाओं को 'वर्ग' द्वारा परिभाषित नहीं किया जाता है 'def' और 'def __init __ (self, ...)' विधि के माध्यम से प्रारंभ किया जाता है। आपने 1 फ़ंक्शन को 'स्वयं' नामक एक आवश्यक पैरा और 'वैकल्पिक' नामक 1 वैकल्पिक पैरा के साथ परिभाषित किया है। जब आप SomeClass (10) को कॉल करते हैं, तो फ़ंक्शन 10 ऑब्जेक्ट को 'सूची' असाइन करने का प्रयास करता है और विफल रहता है। - ओह, ऐसा लगता है कि प्रश्न को दोबारा सुधार दिया जा रहा है ... तो कभी भी बुरा मत मानो। – tdelaney

+0

क्षमा करें, मैंने सुधार किए हैं। मैं अभी इसके साथ बहुत परिचित नहीं हूँ। – LWZ

उत्तर

13

एक और संपत्ति पर एक अद्यतन की वजह से एक संपत्ति को अद्यतन करने के लिए क्या आप के लिए (बजाय नीचे की ओर देख रहे हैं संपत्ति के मूल्य recomputing है उपयोग पर) संपत्ति setters का उपयोग करें:

class SomeClass(object): 
    def __init__(self, n): 
     self.list = range(0, n) 

    @property 
    def list(self): 
     return self._list 
    @list.setter 
    def list(self, val): 
     self._list = val 
     self._listsquare = [x**2 for x in self._list ] 

    @property 
    def listsquare(self): 
     return self._listsquare 
    @listsquare.setter 
    def listsquare(self, val): 
     self.list = [int(pow(x, 0.5)) for x in val] 

>>> c = SomeClass(5) 
>>> c.listsquare 
[0, 1, 4, 9, 16] 
>>> c.list 
[0, 1, 2, 3, 4] 
>>> c.list = range(0,6) 
>>> c.list 
[0, 1, 2, 3, 4, 5] 
>>> c.listsquare 
[0, 1, 4, 9, 16, 25] 
>>> c.listsquare = [x**2 for x in range(0,10)] 
>>> c.list 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
+0

क्या इसका मतलब है कि मुझे 3 गुणों ('आकार', 'सूची',' सूचियों 'को परिभाषित करने की आवश्यकता है) ताकि जब मैं उनमें से एक को अपडेट करूं तो दूसरा 2 अपडेट हो जाएगा? – LWZ

+0

जो सही है। मैंने उपरोक्त उत्तर को जिस तरीके से आप चाहते थे उसे काम करने के लिए अद्यतन किया है - आकार विशेषता अब और आवश्यक महसूस करती है। –

4

बिल्कुल। लेकिन इसके बजाय property का उपयोग करें।

class SomeClass(object): 
    def __init__(self, n=5): 
    self.mylist = range(n) 

    @property 
    def listsquare(self): 
    return [ x**2 for x in self.mylist ] 

a = SomeClass() 
a.mylist = [4, 5, 8] 
print a.listsquare 

संपत्ति मूल्य का कैशिंग पाठक के लिए एक अभ्यास के रूप में छोड़ा गया है।

+0

बढ़िया! दूसरी तरफ के बारे में क्या? क्या मैं 'a.listsquare' को परिभाषित कर सकता हूं और' a.mylist' प्राप्त कर सकता हूं? – LWZ

+0

हां। बस अपनी संपत्ति में एक सेटटर जोड़ें। –

2

तुम भी सिर्फ इस तरह सेटर तरीकों का उपयोग कर सकते हैं,:

अगर
class SomeClass: 
    def __init__(self, n=5): 
     self.set_list(range(n)) 

    def set_list(self, n): 
     self.list = n 
     self.listsquare = [ x**2 for x in self.list ] 

b = SomeClass() 
b.set_list(range(5,10)) 
1

इग्नेसियो के @property समाधान महान है, लेकिन यह सूची हर बार जब आप listsquare संदर्भ पुनर्गणना - कि महंगा हो सकता है। मैथ्यू का समाधान बहुत अच्छा है, लेकिन अब आपके पास फ़ंक्शन कॉल हैं। आप इन्हें 'संपत्ति' फ़ंक्शन से जोड़ सकते हैं। यहां मैं my_list के लिए गेटर और एक सेटटर परिभाषित करता हूं (मैं बस इसे 'सूची' नहीं कह सकता!) कि listsquare उत्पन्न करता है:

class SomeClass(object): 

    def __init__(self, n=5): 
     self.my_list = range(n) 

    def get_my_list(self): 
     return self._my_list 

    def set_my_list(self, val): 
     self._my_list = val 
     # generate listsquare when my_list is updated 
     self.my_listsquare = [x**2 for x in self._my_list] 

    # now my_list can be used as a variable 
    my_list = property(get_my_list, set_my_list, None, 'this list is squared') 

x = SomeClass(3) 
print x.my_list, x.my_listsquare 
x.my_list = range(10) 
print x.my_list, x.my_listsquare 

यह आउटपुट:

[0, 1, 2] [0, 1, 4] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 
+0

लोगों को धन्यवाद कि मैंने गलत तरीके से सूची शुरू की थी। – tdelaney