Не удается найти метод, соответствующий оператору not x
. Существует один для and,or,xor
tho. Где это? https://docs.python.org/3/reference/datamodel.htmlпереопределение оператора в Python
ответ
Нет крючков для and
или or
операторов, нет (как они закорочены), а в Python нет оператора xor
. __and__
и __or__
предназначены для bitwise&
and |
operators, соответственно. Эквивалентным побитовым оператором для not
является ~
(инверсия), который обрабатывается __invert__
method, а __xor__
покрывает поразрядный оператор ^
.
not
действует на truth-value of an object. Если у вас есть контейнер, дайте ему __len__
method, если вы не дадите ему __bool__
method. Спрашивается либо один, чтобы определить, следует ли считать объект «истинным»; not
инвертирует результат этого теста.
Так что если __bool__
возвращает True
или __len__
возвращает целое число, кроме 0
, not
будет инвертировать, что False
, в противном случае not
производит True
. Обратите внимание, что вы не можете сделать not
что-нибудь еще, кроме логического значения!
Из документации __bool__
:
__bool__
Вызывается для реализации тестирования значения истинности и встроенная операцияbool()
; должен вернутьFalse
илиTrue
. Когда этот метод не определен, вызывается__len__()
, если он определен, и объект считается истинным, если его результат отличен от нуля. Если класс не определяет ни__len__()
, ни__bool__()
, все его экземпляры считаются истинными.>
и not
expression на:
В контексте булевых операций, а также, когда выражения используются показаниями потока управления, следующие значения интерпретируются как ложные:
False
,None
, числовой ноль всех типов, а также пустые строки и контейнеры (включая строки, кортежи, списки, словари, наборы и фризоздаты). Все остальные значения интерпретируются как истинные. Пользовательские объекты могут настраивать свое значение истины, предоставляя метод__bool__()
.Оператор
not
даетTrue
, если его аргумент ложный,False
в противном случае.
смелый акцент мой.
Существует один для
and,or,xor
Тхо
методы, которые вы смотрите на это для побитового&
, |
и ^
, не and
, or
или xor
(который ISN» t даже оператор Python).
not
не может быть перегружен, так же как and
и or
не может быть перегружен. Побитовое значение ~
может быть перегружено; это __invert__
.
Если вы находитесь в ситуации, когда вы хотели бы перегружать not
, вы должны либо сделать с перегрузкой ~
вместо этого, или вам придется написать свою собственную logical_not
функцию и использовать его вместо not
оператор.
'not' может влиять, но через' __bool__ '. Просто верните обратный. 'and' и' or' не могут быть переопределены, потому что они закорочены, но это не относится к 'not'. –
@MartijnPieters: на него может повлиять хотя и '__bool__', и если вы действительно хотите, чтобы контролировать, считается ли ваш объект истинным или ложным,' __bool__' - это то, что вы должны использовать, но если вы хотите, чтобы '' '' 'Not' узел дерева выражений или массив инвертированных логических значений, или если вы хотите, чтобы' NOT NULL' был 'NULL' для вашего пользовательского объекта' NULL', '__bool__' вам не поможет, – user2357112
Нет, как описано в моем ответе: * Обратите внимание, что вы не можете заставить 'not' возвращать что-либо еще, кроме логического значения! *. –
[__not__] (https://docs.python.org/2/library/operator.html#operator.__not__). Верните результат не obj. (Обратите внимание, что для экземпляров объекта не существует метода __not __(), но только ядро интерпретатора определяет эту операцию. На результат влияют методы __nonzero __() и __len __().) – BPL