2014-04-28 19 views
5

की सेटर विधि में अनदेखा किए गए सिद्धांत सेटर विधि में निम्न उदाहरण को चलाने में विफल क्यों है?पायथन-2.7: कक्षा

class Foo: 
    a = None 

    @property 
    def a(self): 
     pass 

    @a.setter 
    def a(self, v): 
     ''' 
     >>> 1 == 1 
     False 
     ''' 
     pass 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

डिबगर पुष्टि की है कि कोई परीक्षण (उदाहरण के dtest.py को पत्र लिखा ऊपर) चलाया जाता है:

>>> import dtest, doctest 
>>> doctest.testmod(dtest) 
TestResults(failed=0, attempted=0) 

गेटर विधि में एक ही परीक्षण सही ढंग से क्रियान्वित किया जाता है, रिपोर्टिंग निश्चित रूप से विफलता ...

उत्तर

5

@a.setter डेकोरेटर docstring ध्यान नहीं देता और यह परिणामस्वरूप property वस्तु को कॉपी नहीं किया जाता है; इसके बजाय गेटर पर डॉकस्ट्रिंग सेट करें।

property documentation देखें:

अगर दिया, डॉक संपत्ति विशेषता का docstring हो जाएगा। अन्यथा, संपत्ति fget के docstring (यदि यह मौजूद है) की प्रतिलिपि बनायेगी।

जोर मेरा।

आपका कोड परिणामों में:

>>> class Foo: 
...  a = None 
...  @property 
...  def a(self): 
...   pass 
...  @a.setter 
...  def a(self, v): 
...   ''' 
...   >>> 1 == 1 
...   False 
...   ''' 
...   pass 
... 
>>> Foo.a 
<property object at 0x101a21050> 
>>> Foo.a.__doc__ is None 
True 

तथापि गेटर पर docstring निर्धारित करें और आप पाते हैं:

>>> class Foo: 
...  a = None 
...  @property 
...  def a(self): 
...   ''' 
...   >>> 1 == 1 
...   False 
...   ''' 
...   pass 
...  @a.setter 
...  def a(self, v): 
...   pass 
... 
>>> Foo.a 
<property object at 0x101a210a8> 
>>> Foo.a.__doc__ 
'\n  >>> 1 == 1\n  False\n  ' 

एक और, बदसूरत वैकल्पिक हल docstring होने के साथ संपत्ति से बनाना होगा सेटटर से कॉपी किया गया, स्पष्ट रूप से:

class Foo: 
    a = None 

    @property 
    def a(self): 
     pass 

    @a.setter 
    def a(self, v): 
     ''' 
     >>> 1 == 1 
     False 
     ''' 
     pass 

    a = property(a.fget, a.fset, doc=a.fset.__doc__) 
+0

मुझे लगता है। पूर्णता के लिए, क्या आप तर्क, उचित उपयोग इत्यादि समझाते हुए कोई संदर्भ जोड़ सकते हैं? [आधिकारिक दस्तावेज] (https://docs.python.org/2.7/library/doctest.html) अधिक जानकारी प्रदान नहीं करता है। – sphakka

+0

@ स्फाका: यह वास्तव में करता है; मैंने प्रासंगिक भाग उद्धृत किया। –