Почему я не могу расширить bool в Python?

>>> 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

Я думал, что Python доверяет программисту.

Ответ 1

Гвидо возьмите его:

Я подумал об этом ночи, и понял, что вы не должны быть разрешено подкласса bool вообще! подкласс будет полезен только тогда, когда имеет экземпляры, но простое существование экземпляра подкласса bool нарушит инвариант, что True и False являются единственными BOOL! (Экземпляр подкласса C также является экземпляром C.) Я думаю важно не предоставлять бэкдор для создания дополнительного bool экземпляров, поэтому я думаю, что bool не должен быть подкласса.

Ссылка: http://mail.python.org/pipermail/python-dev/2002-March/020822.html

Ответ 2

Вот сообщение, объясняющее аргументацию решения: http://mail.python.org/pipermail/python-dev/2004-February/042537.html

Идея состоит в том, что bool имеет определенную цель - быть True или быть False, и добавление к этому будет только усложнять ваш код в другом месте.

Ответ 3

Так как OP упоминает в комментарии:

Я хочу, чтобы 1 and 2 возвращал экземпляр моего класса.

Я думаю, что важно отметить, что это совершенно невозможно: Python не позволяет вам изменять встроенные типы (и, в частности, их специальные методы). Literal 1 всегда будет экземпляром встроенного типа int, и в любом случае базовая семантика оператора and в любом случае не является переопределяемой - a and b является always до b if a else a для любых a и b (без bool) принуждения, хотя OP, по-видимому, ошибочно полагает, что это происходит).

Повторяя эту критическую точку: значение a and b равно всегда, неизменно либо a, либо b - существует способ не разбить эту семантическую ограничение (даже если a и b были экземплярами ваших собственных специфических классов - тем более, конечно, когда они ограничены экземплярами встроенного Python int! -).

Ответ 4

Если вы используете Python 3 и хотите иметь класс, который может быть оценен как логический, но также содержать другие функции, выполните __bool__ в вашем классе.

В Python 2 тот же эффект может быть достигнут путем реализации __nonzero__ или __len__ (если ваш класс является контейнером).

Ответ 5

Потому что bool должен иметь только два значения - True и False. Если вы смогли подкласса bool, вы могли бы определить произвольное количество значений для него, и это определенно не то, что вы хотите.

Лучший вопрос: почему вы хотите расширить bool?