2016-02-25 11 views
10

मेरे पास एक कक्षा है जो कई अन्य वर्गों का ट्रैक रखती है। इन सभी वर्गों में से प्रत्येक को किसी विशेष चर के मूल्य तक पहुंचने की आवश्यकता होती है, और इनमें से किसी भी अन्य वर्ग में भी इस विशेष चर को संशोधित करने में सक्षम होना चाहिए, ताकि अन्य सभी वर्ग बदले गए चर को देख सकें।पायथन ऑब्जेक्ट प्रॉपर्टी शेयरिंग

मैंने गुणों का उपयोग करके इसे पूरा करने की कोशिश की।

class A: 
    def __init__(self, state): 
     self._b_obj = B(self) 
     self._state = state 

    @property 
    def state(self): 
     return self._state 

    @state.setter 
    def state(self,val): 
     self._state = val 

    @property 
    def b_obj(self): 
     return self._b_obj 

    @b_obj.setter 
    def b_obj(self,val): 
     self._b_obj = val 


class B: 
    def __init__(self, a_obj): 
     self.a_obj = a_obj 

    @property 
    def state(self): 
     return self.a_obj.state 

    @state.setter 
    def state(self,val): 
     self.a_obj.state = val 

मैं इस प्रकार के रूप में यह काम करना चाहता हूँ:

>>> objA = A(4) 
>>> objB = objA.b_obj 
>>> print objA.state 
4 
>>> print objB.state 
4 
>>> objA.state = 10 
>>> print objA.state 
10 
>>> print objB.state 
10 
>>> objB.state = 1 
>>> print objA.state 
1 
>>> print objB.state 
1 

सब कुछ काम करता है के रूप में मैं यह पिछले 3 आदेशों के अलावा करना चाहते हैं एक उदाहरण इस प्रकार है। वे देते हैं:

>>> objB.state = 1 
>>> print objA.state 
10 
>>> print objB.state 
1 

अंतिम 3 आदेश इन मानों को क्यों वापस करते हैं? मैं इसे कैसे ठीक कर सकता हूं ताकि वे वांछित मान वापस कर सकें?

धन्यवाद

+4

रास्ता साइट के लिए केवल अपने 2 प्रश्न पर एक बहुत सुविचारित, विस्तृत, विशिष्ट दोनों की उम्मीद है और मनाया व्यवहार के साथ सवाल पूछने के लिए। बहुत अच्छा किया। :) –

+3

Sidenote: यदि आप Python27 पर हैं, तो आपकी कक्षाओं को 'ऑब्जेक्ट' विरासत में होना चाहिए। और हाँ, @ g.d.d.c के साथ सहमत हुए, बहुत अच्छी तरह से लिखित प्रश्न। – aneroid

+1

एनेरोइड पोस्ट किए गए अतिरिक्त संदर्भ प्रदान करने के लिए। यहां पाइथन 2.7 के लिए नई स्टाइल क्लासेस पर प्रलेखन है: https://www.python.org/doc/newstyle/ – idjaw

उत्तर

5

तो ऐसा लगता है तुम सब करने की जरूरत है अपनी कक्षाओं object से विरासत :-) कि आप new-style classes और all their benefits देता है।

class A(object): 
    ... # rest is as per your code 

class B(object): 
    ... # rest is as per your code 

>>> objA = A(4) 
>>> objB = objA.b_obj 
>>> print objA.state 
4 
>>> print objB.state 
4 
>>> objA.state = 10 
>>> print objA.state 
10 
>>> print objB.state 
10 
>>> objB.state = 1 
>>> print objA.state 
1 
>>> print objB.state 
1 

क्यों यह केवल नई शैली वर्गों के साथ काम करेंगे के लिए विशिष्ट कारणों, from here:

वस्तुओं के लिए, मशीनरी object.__getattribute__() जो type(b).__dict__['x'].__get__(b, type(b)) में b.x बदल देती है।

कक्षाओं के लिए, मशीनरी type.__getattribute__() में है जो B.xB.__dict__['x'].__get__(None, B) में बदलती है।

(से "महत्वपूर्ण बिंदुओं को याद है")

  • __getattribute__() नई शैली वर्गों के साथ ही उपलब्ध है और वस्तुओं

  • object.__getattribute__() और type.__getattribute__()__get__() करने के लिए विभिन्न कॉल करते हैं।

+1

यदि आप थोड़ी अधिक जानकारी जोड़ना चाहते हैं, तो आप अतिरिक्त जानकारी के लिए ओपी टिप्पणी में पोस्ट किए गए प्रलेखन लिंक को जोड़ सकते हैं। – idjaw

+1

धन्यवाद, मैं प्रासंगिक अनुभाग को उद्धृत करने के लिए बस इसकी तलाश कर रहा था। – aneroid

+0

आपकी मदद के लिए बहुत बहुत धन्यवाद! – Bedlington

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