2012-05-25 12 views
6

निर्धारित नहीं करता है यहाँ कोड है:अजगर संपत्ति

def Property(func): 
    return property(**func()) 

class A: 
    def __init__(self, name): 
      self._name = name 

    @Property 
    def name(): 
      doc = 'A''s name' 

      def fget(self): 
       return self._name 

      def fset(self, val): 
       self._name = val 

      fdel = None 

      print locals() 
      return locals() 

a = A('John') 
print a.name 
print a._name 
a.name = 'Bob' 
print a.name 
print a._name 

से ऊपर निम्नलिखित उत्पादन का उत्पादन:

{'doc': 'As name', 'fset': <function fset at 0x10b68e578>, 'fdel': None, 'fget': <function fget at 0x10b68ec08>} 
John 
John 
Bob 
John 

कोड from here लिया जाता है।

प्रश्न: क्या गलत है? यह कुछ आसान होना चाहिए लेकिन मुझे यह नहीं मिल रहा है।

नोट: मुझे जटिल हो रही/सेटिंग के लिए संपत्ति की आवश्यकता है, न केवल विशेषता को छुपाएं।

अग्रिम धन्यवाद।

+0

आप 100% निश्चित है कि 'fset' निर्धारित नहीं करता है' 'name' _name' के बजाय कर रहे हैं? बनाने में आसान गलती, और आपके लक्षणों को समझाएगी .. –

+0

@MartijnPieters 99.9% मैंने अभी कोड और इस कोड द्वारा उत्पादित आउटपुट की प्रतिलिपि बनाई है =) – tonytony

+1

केवल '@property def' का उपयोग करने के बजाय गुणों को परिभाषित करने का यह अजीब तरीका करने का कोई कारण नाम (...): "docstr" \ n getter', '@name.setter def name (...): सेटर'? – delnan

उत्तर

8

documentation for property() कहता है:

वापसी नई शैली कक्षाओं के लिए एक संपत्ति विशेषता (कक्षाएं उस वस्तु से निकाले जाते हैं)।

आपकी कक्षा एक नई शैली की कक्षा नहीं है (आपने ऑब्जेक्ट से प्राप्त नहीं किया है)। वर्ग घोषणा को बदलें:

class A(object): 
    ... 

और इसे इरादे के अनुसार काम करना चाहिए।

+0

100% सही! उस बारे में सोचा नहीं होगा! – jadkik94

+1

ध्यान दें कि पायथन 3.x के तहत, सभी वर्ग डिफ़ॉल्ट रूप से नई शैली हैं, इसलिए यह कोई समस्या नहीं होगी (हालांकि यह वैसे भी 'ऑब्जेक्ट' से उपclass को चोट नहीं पहुंचाता है)। –

+0

वाह यह काम करता है! मैं इस तथ्य से और भी उलझन में था कि संपत्ति _did_ मूल्य को सही तरीके से प्राप्त करती है, इसलिए मुझे नहीं पता था कि यह 'संपत्ति' कार्य स्वयं ही विफल रहा था। – tonytony

1

(ऊपर प्रकाशित किया गया था) इस प्रारूप का उपयोग: http://docs.python.org/library/functions.html#property

class C(object): 
    def __init__(self): 
     self._name = "nameless" 

    @property 
    def name(self): 
     """I'm the 'name' property.""" 
     return self._name 

    @name.setter 
    def name(self, value): 
     self._name = value 

    @name.deleter 
    def name(self): 
     del self._name