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

26
задан Juanjo Conti 31 January 2010 в 15:34
поделиться

5 ответов

Гвидо взялся за это:

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

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

48
ответ дан 28 November 2019 в 06:18
поделиться

Простым ответом является принцип разделения проблем . Конечно, кто-то может утверждать, что, помещая презентационную модель в код позади, она отделена от представления (XAML), но я с этим не согласен. Код позади может «видеть» все внутренние детали ракурса, поскольку он является ракурсом. Как xaml, так и code-background компилируются вместе в один класс, чтобы стать View. Они совсем не отдельные.

Существует множество примеров, когда вы должны войти в код, чтобы сделать связанные с просмотром вещи, такие как подключение взаимодействий между элементами управления, которые вы просто не можете указать в Xaml. После этого логика представления будет смешана с логикой представления.

Концепция ViewModel достаточно мощна. ViewModels могут «разговаривать» друг с другом без «говорящих» друг с другом представлений или даже без того, чтобы ViewModels «знали» что-либо о представлениях.

-121--5044593-

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

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

-121--1472622-

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

Вопрос получше: почему вы хотите продлить срок службы?

4
ответ дан 28 November 2019 в 06:18
поделиться

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

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

7
ответ дан 28 November 2019 в 06:18
поделиться

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

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

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

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

10
ответ дан 28 November 2019 в 06:18
поделиться

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

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

9
ответ дан 28 November 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: