2010-01-31 10 views
7

कहें कि आपके पास पाइथन में एक सार्वजनिक विधि है जिसका प्राथमिक उद्देश्य अंतर्निहित डेटा विशेषता (यानी आंतरिक बैकिंग स्टोर) के मूल्य को पुनर्प्राप्त करना है। विधि में आलसी मूल्यांकन तर्क हो सकता है, आदि। एक संपत्ति ऐसी विधि का एक उदाहरण है।पायथन में, आंतरिक संपत्ति की बैकिंग स्टोर के लिए पसंदीदा नामकरण सम्मेलन क्या है?

फिर डेटा विशेषता के लिए अंडरस्कोर उपसर्ग को छोड़कर, विधि और डेटा विशेषता के लिए उसी नाम का उपयोग करना स्वाभाविक है। के लिए example--

class C(object): 
def __init__(self): 
    self._x = None 

@property 
def x(self): 
    """I'm the 'x' property.""" 
    return self._x 

(Python's "property" documentation से)

लेकिन कुछ पसंदीदा सम्मेलनों क्या कर रहे हैं विधि आंतरिक उपयोग के लिए है और इसलिए ही एक अंडरस्कोर के साथ उपसर्ग है? बैकिंग स्टोर को दो प्रमुख अंडरस्कोर के साथ उपसर्ग करना नाम उलझन का आह्वान करेगा और इसलिए आदर्श नहीं है।

दो संभावनाओं be-- सकता

def _get_x(self): 
    return self._x 

def _x(self): 
    return self._x_ 

अजगर शैली दूसरे कहते हैं (एक अंडरस्कोर जोड़कर), हालांकि, केवल आरक्षित कीवर्ड के साथ टकराव से बचने के लिए इस्तेमाल किया जाना चाहिए।

+0

मुझे खुशी है कि टिप्पणियां एक -1 स्कोर नहीं हो सकता हूँ। –

+0

मुझे लगता है कि एक निजी संपत्ति होने से बहुत से लोगों को भ्रमित कर दिया जाएगा। मैं सुझाव देता हूं कि 'संपत्ति' से आपकी अपनी कक्षा को प्राप्त करने का सुझाव दिया जाए, शायद, 'cached_property', और इसके लिए' __get__' को परिभाषित करने के लिए, अगर यह पहले से नहीं है, और यदि यह है, तो उस मूल्य को वापस लौटाएं जब यह वापस लौटाया जाए बुलाया गया था। और कैश किए गए मान को भूलने के लिए '__delete__' को परिभाषित करें। – Omnifarious

+0

मैंने अभी यह देखने के लिए उनमें से एक लिखा है कि यह किया जा सकता है या नहीं। और वास्तव में यह कर सकता है, लेकिन यह थोड़ा बदसूरत है, और कमजोर संदर्भों का उपयोग करने की आवश्यकता है, जिसका मतलब है कि जिस संपत्ति को संपत्ति में रखा गया है वह कमजोर संदर्भ-सक्षम होना चाहिए। – Omnifarious

उत्तर

1

यदि आप आंतरिक उपयोग के लिए हैं तो आप इसे संपत्ति क्यों बनायेंगे? यदि यह आंतरिक उपयोग के लिए है, तो सीधे विशेषता का उपयोग करें।

लेकिन फिर भी आप एक अंडरस्कोर का उपयोग करेंगे, लेकिन इसे कुछ और कहें। लेकिन फिर, इस मामले में इसे संपत्ति बनाने का पूरा बिंदु खो गया है।

+2

यदि आप तर्क निष्पादित करने की आवश्यकता है, तो आप इसे एक संपत्ति बनाना चाहते हैं, उदाहरण के लिए आलसी मूल्यांकन। – cjerdonek

+0

और फिर जब आप आंतरिक होते हैं, तो आप सीधे उस विधि को कॉल कर सकते हैं। –

+1

-1 क्योंकि यह कोई जवाब नहीं है, हालांकि मैंने शुरुआत में प्रश्न को गलत तरीके से पढ़ा और इसलिए आपको अपने प्रश्न का गलत जवाब दिया। @ क्रिस जे के पास एक अच्छा जवाब है। – Omnifarious

3

पसंदीदा सम्मेलन एक अग्रणी अंडरस्कोर का उपयोग करना है।

यह PEP 8 निजी विशेषताओं के लिए अनुशंसा है।

संपत्ति के लिए docstring() में इस उदाहरण देखें:

>>> help(property) 
Help on class property in module builtins: 

class property(object) 
| property(fget=None, fset=None, fdel=None, doc=None) -> property attribute 
| 
| fget is a function to be used for getting an attribute value, and likewise 
| fset is a function for setting, and fdel a function for del'ing, an 
| attribute. Typical use is to define a managed attribute x: 
| class C(object): 
|  def getx(self): return self._x 
|  def setx(self, value): self._x = value 
|  def delx(self): del self._x 
|  x = property(getx, setx, delx, "I'm the 'x' property.") 
| 
| Decorators make defining new properties or modifying existing ones easy: 
| class C(object): 
|  @property 
|  def x(self): return self._x 
|  @x.setter 
|  def x(self, value): self._x = value 
|  @x.deleter 
|  def x(self): del self._x 
| 
संबंधित मुद्दे