2010-03-04 5 views
7

एक सुंदर तरीका डेकोरेटर लागू का उपयोग करके, एक समारोह के फ्रेम में वर्ग संपत्ति व्यवस्थित करने के लिए किया गया था।प्रतिवाद

class Example(object): 
    @apply 
    def myattr(): 
     doc = """This is the doc string.""" 

     def fget(self): 
      return self._half * 2 

     def fset(self, value): 
      self._half = value/2 

     def fdel(self): 
      del self._half 

     return property(**locals()) 

लेकिन अब आवेदन को हटा दिया गया है।

वहाँ नए के साथ इस तरह सादगी और संपत्ति के लिए पठनीयता प्राप्त करने के लिए किसी भी संभावना है, के बजाय आया "विस्तारित कॉल वाक्य रचना"?


मेरे दृष्टिकोण अनुराग के रूप में ही है, लेकिन, अब मैं डायन नहीं है एक बेहतर है, देखने के लिए कृपया:

def prop(f): 

    return property(**f()) 

class A(object): 

    @prop 
    def myattr(): 

     def fget(self): 
      return self._myattr 

     def fset(self, value): 
      self._myattr = value 

     return locals() 

उत्तर

12

ऐसी सादगी और संपत्ति के लिए पठनीयता प्राप्त करने के लिए किसी भी संभावना है

नया अजगर 2.6 तरीका है:

@property 
def myattr(self): 
    """This is the doc string.""" 
    return self._half * 2 

@myattr.setter 
def myattr(self, value): 
    self._half = value/2 

@myattr.deleter 
def myattr(self): 
    del self._half 
+3

मुझे यह नहीं पता था और मुझे यह बहुत पसंद है। ऊपर 'लागू' जादू इतना अपठनीय था कि मुझे नहीं पता था कि सवाल क्या था। मैं @property जानता था और इसका बहुत उपयोग करता हूं, लेकिन .setter और .deleter मेरे लिए नए हैं और महान (स्वयं-दस्तावेज़ कोड) देखें :) –

+0

आप गेटटर के तर्कों में स्वयं को याद कर रहे हैं, नहीं? –

+0

@ डेविड: सही, तय, टा। – bobince

0

तुम हमेशा लिख ​​सकते हैं अपनी खुद की:

def apply(f, a): 
    return f(*a) 

हालांकि, मुझे पूरा यकीन नहीं है कि इस तरह से एक सजावटी के रूप में apply का उपयोग करने का लाभ मुझे मिलता है। उपयोग का मामला क्या है? हालांकि मैं अगर कोई नुकसान कर रहे हैं यकीन नहीं है

+1

मैं एक समारोह के दायरे में fget/fset विधियों की घोषणा करना चाहते हैं। सजावट लागू करने के अलावा, कोई अन्य समाधान है? –

2

कि :), लागू की एक चतुर उपयोगकर्ता है?

वैसे भी आप कर सकते हैं इस

class Example(object): 
    def myattr(): 
     doc = """This is the doc string.""" 

     def fget(self): 
      return self._half * 2 

     def fset(self, value): 
      self._half = value/2 

     def fdel(self): 
      del self._half 

     return property(**locals()) 
    myattr = myattr() 
संबंधित मुद्दे