2012-02-06 18 views
8

मैं अजगर में गुणों के बारे में थोड़ा उलझन में हूं। निम्नलिखित कोडपायथन संपत्ति गेटर/सेटर भ्रम

class A: 
    @property 
    def N(self): 
     print("A getter") 
     return self._N 
    @N.setter 
    def N(self,v): 
     print("A setter") 
     self._N = v 

    def __init__(self): 
     self._N = 1 

class B: 
    @property 
    def N(self): 
     print("B getter") 
     return self.a.N 
    @N.setter 
    def N(self,v): 
     print("B setter") 
     self.a.N = v 

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

if __name__ == '__main__': 
    b=B() 
    b.N = 2 
    print(b.N, b.a.N) 
    b.N = 3 
    print(b.N, b.a.N) 

बी पर विचार ए के लिए एक आवरण की तरह कुछ यह getters और setters का उपयोग करता है पर ही एक के गुणों को मैप करने के लिए (के पाठ्यक्रम भी इसे विरासत के माध्यम से भी कर सकता है) होना चाहिए। समस्या है, कि यह बस python2.6 में अपेक्षा के अनुरूप, जबकि यह python3 में करता है काम नहीं करता:

> python2 test.py 
A getter 
(2, 1) 
A getter 
(3, 1) 

> python3 test.py 
B setter 
A setter 
B getter 
A getter 
A getter 
2 2 
B setter 
A setter 
B getter 
A getter 
A getter 
3 3 

मैंने कुछ गलत कर रहा हूँ या जहां वास्तव में समस्या है?

उत्तर

18

ए और बी पायथन 2.x में नई शैली की कक्षाएं होनी चाहिए।

property([fget[, fset[, fdel[, doc]]]])

वापसी new-style classes के लिए एक संपत्ति विशेषता (कक्षाएं कि object से निकाले जाते हैं)।

तो तुम object

class A(object): 
    ... 

class B(object): 
    ... 

आपका कोड से निकाले जाते हैं यदि अपेक्षा के अनुरूप काम करेंगे।

+0

ठीक है आप सही हैं, जो इसे हल करता है लेकिन मुझे यह समझ में नहीं आता कि यहां क्या गलत है। – buergi

+1

@buergi पुरानी शैली के वर्गों में वर्णनकर्ता नहीं हो सकते हैं। '@ संपत्ति 'वर्णनकर्ता है। [पायथन डेटा मॉडल संदर्भ] पर अधिक जानकारी (http://docs.python.org/reference/datamodel.html) – reclosedev