Почему я не могу расширить 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?