2010-01-31 11 views
23
>>> class BOOL(bool): 
...  print "why?" 
... 
why? 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: Error when calling the metaclass bases 
    type 'bool' is not an acceptable base type 

मैंने सोचा कि पायथन प्रोग्रामर पर भरोसा करते हैं।क्यों मैं पायथन में बूल का विस्तार नहीं कर सकता?

+10

क्या आप एक FileNotFound मान जोड़ना चाहते हैं? – Juliano

+1

"रचना बनाम विरासत" के लिए Google खोज या SO खोज यहां उपयोगी हो सकती है। – MatrixFrog

उत्तर

41

उस पर गुइडो के टेक:

I thought about this last night, and realized that you shouldn't be allowed to subclass bool at all! A subclass would only be useful when it has instances, but the mere existance of an instance of a subclass of bool would break the invariant that True and False are the only instances of bool! (An instance of a subclass of C is also an instance of C.) I think it's important not to provide a backdoor to create additional bool instances, so I think bool should not be subclassable.

संदर्भ: http://mail.python.org/pipermail/python-dev/2002-March/020822.html

+14

सही और गलत सिंगलटन हैं। यह एक बेहतर जवाब है। –

+1

जानना अच्छा है कि चीजें सुसंगत हैं: 'कक्षा फू (कोई नहीं .__ वर्ग__): ... '->' टाइप एरर: टाइप करें 'कोई नहीं टाइप' स्वीकार्य आधार प्रकार नहीं है –

9

यहाँ एक पोस्ट है कि निर्णय के पीछे तर्क बताते है: http://mail.python.org/pipermail/python-dev/2004-February/042537.html

विचार bool एक विशिष्ट प्रयोजन है कि - True होने के लिए या False होने के लिए, और कहा कि में जोड़ने से केवल जटिल काम करेगा आपके कहीं और कोड।

4

क्योंकि bool केवल दो मान हैं - True और False। यदि आप bool उप-वर्ग में सक्षम थे, तो आप इसके लिए मूल्यों की मनमानी संख्या को परिभाषित कर सकते हैं, और यह निश्चित रूप से नहीं है कि आप क्या करना चाहते हैं।

एक बेहतर सवाल यह है कि आप बूल का विस्तार क्यों करना चाहते हैं?

+0

मैं एक विशेषता जोड़ना चाहता हूं जो मुझे ऑब्जेक्ट पर कुछ चीजों को ट्रैक करने दे। –

+4

@ जुआनजो तो आप जो चाहते हैं वह बुलियन नहीं है, यह एक बूलियन का एक गुच्छा है और कुछ और है। एक बूलियन या तो एक सच्चा या झूठा होना चाहिए, कोई अन्य मूल्य नहीं है और कोई अन्य विशेषता नहीं है जो उस वर्ग का उदाहरण दोहरी और गलत दोनों के साथ नकारात्मक रूप से तुलना करने के लिए करेगी।ऐसा होने वाला था, यह अब एक बूलियन नहीं होगा। – Juliano

+0

ठीक है, लेकिन मैं इस tuple को वापस करने के लिए int .__ nonzero__ ओवरराइड नहीं कर सकता। क्या मैं? –

5

आप अजगर 3 का उपयोग कर रहे हैं, और आप एक वर्ग है कि एक बूलियन के रूप में मूल्यांकन किया जा सकता है करना चाहते हैं, लेकिन यह भी तो अन्य कार्यक्षमता हो , अपनी कक्षा में __bool__ लागू करें।

पायथन 2 में __nonzero__ या __len__ (यदि आपकी कक्षा एक कंटेनर है) को लागू करके एक ही प्रभाव प्राप्त किया जा सकता है।

+3

पायथन 2.x में आप इसे लागू करके भी कर सकते हैं '__nonzero__' या' __len__'। –

+0

मैं अपनी कक्षा का एक उदाहरण वापस करने के लिए 1 और 2 चाहता हूं। आपको इसे कैसे करना होगा? –

+2

पहले उप-वर्गीकरण बूल, फिर int विधियों को ओवरराइड करना ... आप अपनी खुद की कक्षा को खरोंच से क्यों नहीं बनाते? – Agos

9

के बाद से ओ पी ने एक टिप्पणी में उल्लेख है:

I want 1 and 2 to return an instance of my class.

मुझे लगता है यह कहना है कि यह पूरी तरह से असंभव है महत्वपूर्ण है: अजगर नहीं करता है आप बदल में निर्मित प्रकार (और विशेष रूप से, उनके विशेष तरीकों)। शाब्दिक 1 हमेशा का एक उदाहरण हो जाएगा निर्मित प्रकार int, और किसी भी मामले में and ऑपरेटर के बुनियादी अर्थ विज्ञान वैसे भी overridable नहीं हैं - a and b हमेशा हैकिसी भीa और b (कोई bool बलात्कार के लिए b if a else a के समान इसमें शामिल है, भले ही ओपी गलती से मानता है कि कोई हो रहा है)।

इस महत्वपूर्ण बिंदु restating: a and b का मूल्य हमेशा की तरह, या तो a या b है unchangeably - वहाँ है कोई तरीका यह अर्थ बाधा को तोड़ने के लिए (भले ही a और b अपनी खुद की अजीब वर्गों के उदाहरण थे - - निश्चित रूप से तब भी कम जब वे पाइथन के अंतर्निहित int के उदाहरण होने के बाध्य हैं!)।

संबंधित मुद्दे