2010-01-31 17 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 

Pensavo che Python si fidasse del programmatore.Perché non riesco a estendere il bool in Python?

+10

Vuoi aggiungere un valore FileNotFound? – Juliano

+1

Una ricerca Google o una ricerca SO per "composizione vs. ereditarietà" potrebbe essere utile qui. – MatrixFrog

risposta

41

introito di Guido su di esso:

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.

Riferimento: http://mail.python.org/pipermail/python-dev/2002-March/020822.html

+14

True e False sono singleton. Questa è una risposta migliore. –

+1

Buono a sapersi che le cose sono coerenti: 'classe Foo (None .__ class__): ...' -> 'TypeError: tipo 'NoneType' non è un tipo di base accettabile' –

4

Perché si suppone che bool contenga solo due valori: True e False. Se si fosse in grado di creare sottoclasse di bool, è possibile definire numeri arbitrari di valori per esso, e questo non è sicuramente ciò che si desidera che accada.

Una domanda migliore è: perché vuoi estendere il bool?

+0

Vorrei aggiungere un attributo che mi permetta di tracciare alcune cose sull'oggetto. –

+4

@Juanjo quindi quello che vuoi non è un booleano, è una tupla di un booleano e qualcos'altro. Un valore booleano deve essere True o False, nessun altro valore e nessun altro attributo che possa rendere un'istanza di quella classe un confronto negativo con True e False.Doveva succedere, non sarebbe più un booleano. – Juliano

+0

Va bene, ma non posso eseguire l'override di int .__ nonzero__ per restituire questa tupla. Posso? –

5

Se si sta utilizzando Python 3, e si desidera avere una classe che può essere valutata come un valore booleano, ma contengono anche altre funzionalità , attua __bool__ nella tua classe.

In Python 2 lo stesso effetto può essere ottenuto implementando __nonzero__ o __len__ (se la classe è un contenitore).

+3

In Python 2.x puoi fare lo stesso implementando '__nonzero__' o' __len__'. –

+0

Voglio 1 e 2 per restituire un'istanza della mia classe. Come lo faresti? –

+2

Prima bool sottoclasse, quindi sovrascrivendo i metodi int ... perché non basta creare la propria classe da zero? – Agos

9

Dal momento che l'OP menziona in un commento:

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

penso che sia importante sottolineare che questo è del tutto impossibile: Python non consente di modificare tipi built-in (e, in particolare, i loro metodi speciali). Letterale 1 sarà sempre un esempio di tipo ad incasso int, e in ogni caso la semantica fondamentali del gestore and non sono comunque overridable - a and b è sempre identico a b if a else a per qualsiasia e b (senza bool coercizione coinvolto, anche se l'OP sembra credere erroneamente che stia accadendo).

Riprendendo questo punto cruciale: il valore di a and b è sempre, immutabilmente sia a o b - non v'è alcun modo per rompere questo vincolo semantica (anche se a e b erano le istanze di proprie classi peculiari - - ancor meno ovviamente quando sono vincolati ad essere istanze di built-in Python int! -).

Problemi correlati