आप के साथ एक वर्ग चाहते हैं "बंद-नीचे" उदाहरण के गुण, यह एक बनाने के लिए मुश्किल नहीं है, जैसे:
class LockedDown(object):
__locked = False
def __setattr__(self, name, value):
if self.__locked:
if name[:2] != '__' and name not in self.__dict__:
raise ValueError("Can't set attribute %r" % name)
object.__setattr__(self, name, value)
def _dolock(self):
self.__locked = True
class Example(LockedDown):
def __init__(self):
self.mistakes = 0
self._dolock()
def onemore(self):
self.mistakes += 1
print self.mistakes
def reset(self):
self.mitsakes = 0
x = Example()
for i in range(3): x.onemore()
x.reset()
जैसा कि आप देखेंगे, x.onemore
काम करने के लिए कॉल ठीक है, लेकिन reset
mitsakes
के रूप में विशेषता की गलत वर्तनी के कारण अपवाद उठाता है। यहां सगाई के नियम हैं कि __init__
को सभी विशेषताओं को प्रारंभिक मानों पर सेट करना होगा, फिर self._dolock()
पर कॉल करने के लिए विशेषताओं को और भी शामिल करना होगा। मैं "सुपर-प्राइवेट" विशेषताओं (__
से शुरू होने वाले) को छूट दे रहा हूं, जो पूरी तरह से विशिष्ट भूमिकाओं के लिए स्टाइलिस्टिक रूप से बहुत ही कम इस्तेमाल किया जाना चाहिए, और बेहद सीमित दायरे के साथ (इसे सुपर-सावधानीपूर्वक निरीक्षण में स्पॉट टाइपो को छोटा करना वैसे भी सुपर-गोपनीयता की आवश्यकता की पुष्टि करने के लिए), लेकिन यह एक स्टाइलिस्ट पसंद है, जो रिवर्स करना आसान है; इसी प्रकार लॉक डाउन स्टेट "अपरिवर्तनीय" ("सामान्य" माध्यम से - यानी बाईपास के लिए बहुत स्पष्ट कामकाज की आवश्यकता होती है) के विकल्प के लिए।
यह फ़ंक्शन-स्थानीय वाले अन्य प्रकार के नामों पर लागू नहीं होता है; दोबारा, कोई बड़ा सौदा नहीं है क्योंकि प्रत्येक कार्य बहुत छोटा होना चाहिए, और पूरी तरह आत्मनिर्भर दायरा है, निरीक्षण करने में तुच्छ आसान है (यदि आप 100-पंक्तियों के कार्यों को लिखते हैं, तो आपके पास अन्य गंभीर समस्याएं हैं ;-)।
क्या यह परेशान है? नहीं, क्योंकि अर्द्ध सभ्य इकाई परीक्षणों को वर्ग की कार्यक्षमता का पूरी तरह से उपयोग करने के प्राकृतिक दुष्प्रभाव के रूप में, आसानी से सबसे अधिक आसानी से ऐसे सभी टायपों को पकड़ना चाहिए। दूसरे शब्दों में, ऐसा नहीं है कि आपको टाइप करने के लिए और यूनिट परीक्षणों की आवश्यकता है: यूनिवर्सिटी परीक्षणों को आपको छोटी सी अर्थपूर्ण त्रुटियों को पकड़ने के लिए वैसे भी चाहिए (एक-एक-एक, +1 जहां -1 मतलब है, आदि , आदि) पहले से ही सभी typos पकड़ लेंगे।
रॉबर्ट मार्टिन और ब्रूस एकेल दोनों अलग और स्वतंत्र लेख में इस बिंदु व्यक्त 7 साल पहले - Eckel के ब्लॉग अभी अस्थायी रूप से बंद है, लेकिन मार्टिन सही here, और जब Eckel की साइट जान लेख here होना चाहिए। थीसिस विवादास्पद है (जेफ अटवुड और उनकी टिप्पणीकार इसे उदाहरण के लिए here पर बहस करते हैं), लेकिन यह ध्यान रखना दिलचस्प है कि मार्टिन और एकल दोनों सी ++ और जावा जैसी स्थिर भाषाओं के प्रसिद्ध विशेषज्ञ हैं (हालांकि प्रेम मामलों के साथ क्रमशः, रुबी और पायथन), और वे केवल एकमात्र लोगों से यूनिट-टेस्ट के महत्व की खोज कर चुके हैं ... और साइड इफेक्ट के रूप में एक अच्छा यूनिट-टेस्ट सूट कैसे स्थिर भाषा की कठोरता को अनावश्यक बनाता है।
वैसे, आपके परीक्षण सूट को जांचने का एक तरीका "त्रुटि इंजेक्शन" है: व्यवस्थित रूप से अपने कोडबेस पर एक गलत वर्तनी पेश करना - यह सुनिश्चित करने के लिए परीक्षण चलाएं कि वे विफल हो जाएं, अगर वे एक नहीं जोड़ते हैं विफल रहता है, वर्तनी गलती को सही करता है, दोहराना। काफी अच्छी तरह से स्वचालित हो सकता है ("एक परीक्षण जोड़ें" भाग नहीं, लेकिन सूट द्वारा कवर नहीं होने वाली संभावित त्रुटियों की खोज), जैसा कि त्रुटि इंजेक्शन के कुछ अन्य रूप हो सकते हैं (प्रत्येक पूर्णांक स्थिर, एक-एक करके बदलें, एक और, एक से कम; प्रत्येक <
से <=
आदि बदलें; प्रत्येक if
और while
स्थिति को इसके विपरीत करने के लिए स्वैप करें; ...), जबकि त्रुटि-इंजेक्शन के अन्य रूपों के लिए अभी भी बहुत अधिक मानवीय समझदार की आवश्यकता है। दुर्भाग्यवश मुझे त्रुटि इंजेक्शन ढांचे (किसी भी भाषा के लिए) के सार्वजनिक रूप से उपलब्ध सूटों के बारे में पता नहीं है - एक अच्छा ओपन सोर्स प्रोजेक्ट बना सकता है ;-)।
"पाइथन आपको क्यों मजबूर करता है" ... "यह बग का कारण नहीं बन सकता" यह "व्यक्तिपरक और तर्कवादी" की परिभाषा है। मैंने करीब मतदान किया। – balpha
@balpha सीखने पर विचार करें कि "व्यक्तिपरक" और "तर्कवादी" शब्द क्या हैं, जैसा कि आप उद्धृत उदाहरण दोनों के सटीक विपरीत * हैं। – hobbs
@ हॉब्स मैं * करीबी कारण * "व्यक्तिपरक और तर्कवादी" की परिभाषा के बारे में बात कर रहा हूं (दोनों शब्दों के चारों ओर उद्धरण के * एकल * जोड़ी को नोट करें)। इस सवाल का जवाब देना असंभव है [उदाहरण 2], और सवाल एक टकराव, तर्कसंगत तरीके से पूछा गया था [उदाहरण 1]। – balpha