Почему я не могу расширить bool в Python? - PullRequest
25 голосов
/ 31 января 2010
>>> 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 доверяет программисту.

Ответы [ 5 ]

46 голосов
/ 31 января 2010

Гвидо принимает это:

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

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

10 голосов
/ 31 января 2010

Поскольку ОП упоминает в комментарии:

Я хочу 1 and 2 вернуть экземпляр моего класса.

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

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

9 голосов
/ 31 января 2010

Вот пост, который объясняет причину решения: http://mail.python.org/pipermail/python-dev/2004-February/042537.html

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

6 голосов
/ 31 января 2010

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

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

4 голосов
/ 31 января 2010

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

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

...