>>> 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 доверял программисту.
Гвидо взялся за это:
Я думал об этом в последний раз. ночью, и понял, что тебе не стоит вообще иметь право на подкласс шутить! A подкласс будет полезен только тогда, когда он есть случаи, но само существование подкласс шерсти сломает инварианта, что Истина а Ложь - это единственные случаи шут! (Пример подкласса C это также пример C.) Я думаю. важно не предоставлять черный ход для создания дополнительного шума в случаях, так что, я думаю, что шутихам не стоит быть подклассом.
Ссылка: http://mail.python.org/pipermail/python-dev/2002-March/020822.html
Простым ответом является принцип разделения проблем . Конечно, кто-то может утверждать, что, помещая презентационную модель в код позади, она отделена от представления (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
, и добавление к этому послужит только усложнением кода в другом месте.
Поскольку bool
должен иметь только два значения - True
и False
. Если бы удалось подкласс bool
, можно было бы определить для него произвольное количество значений, и это определенно не то, что вы хотите сделать.
Вопрос получше: почему вы хотите продлить срок службы?
Если вы используете Python 3, и хотите иметь класс, который может быть оценен как булевый, но также содержит другую функциональность, реализуйте __bool__
в своем классе.
На Python 2 того же эффекта можно добиться, реализовав __nonzero__
или __len__
(если ваш класс является контейнером).
Поскольку OP упоминает в комментарии:
Я хочу, чтобы
1 и 2
возвращали экземпляр моего класса.
Я думаю, важно отметить, что это совершенно невозможно: Python не позволяет вам изменять встроенные типы (и, в частности, их специальные методы). Литерал 1
всегда будет экземпляром встроенного типа int
, и в любом случае базовая семантика операторов и
в любом случае не может быть переопределена - a и b
всегда идентично b, если a else a
для any a
и b
( нет bool
принуждения, хотя ОП, кажется, ошибочно полагает, что оно происходит).
Повторяя этот важный момент: значение a и b
всегда равно , неизменно либо a
, либо b
- есть нет способа разорвать это семантическое ограничение (даже если a
и b
были экземплярами ваших собственных специфических классов - тем более, конечно, когда они ограничены быть экземплярами встроенного в Python int
! -).
Вот сообщение, объясняющее причину этого решения: http://mail.python.org/pipermail/python-dev/2004-Feb February/042537.html
Идея состоит в том, что bool
имеет особую цель - быть True
или быть False
, и добавление к этому только усложнит ваш код в другом месте.