2016-09-28 1 views
0

Не удается найти метод, соответствующий оператору not x. Существует один для and,or,xor tho. Где это? https://docs.python.org/3/reference/datamodel.htmlпереопределение оператора в Python

+0

[__not__] (https://docs.python.org/2/library/operator.html#operator.__not__). Верните результат не obj. (Обратите внимание, что для экземпляров объекта не существует метода __not __(), но только ядро ​​интерпретатора определяет эту операцию. На результат влияют методы __nonzero __() и __len __().) – BPL

ответ

2

Нет крючков для 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 в противном случае.

смелый акцент мой.

3

Существует один для and,or,xor Тхо

методы, которые вы смотрите на это для побитового&, | и ^, не and, or или xor (который ISN» t даже оператор Python).

not не может быть перегружен, так же как and и or не может быть перегружен. Побитовое значение ~ может быть перегружено; это __invert__.

Если вы находитесь в ситуации, когда вы хотели бы перегружать not, вы должны либо сделать с перегрузкой ~ вместо этого, или вам придется написать свою собственную logical_not функцию и использовать его вместо not оператор.

+0

'not' может влиять, но через' __bool__ '. Просто верните обратный. 'and' и' or' не могут быть переопределены, потому что они закорочены, но это не относится к 'not'. –

+0

@MartijnPieters: на него может повлиять хотя и '__bool__', и если вы действительно хотите, чтобы контролировать, считается ли ваш объект истинным или ложным,' __bool__' - это то, что вы должны использовать, но если вы хотите, чтобы '' '' 'Not' узел дерева выражений или массив инвертированных логических значений, или если вы хотите, чтобы' NOT NULL' был 'NULL' для вашего пользовательского объекта' NULL', '__bool__' вам не поможет, – user2357112

+0

Нет, как описано в моем ответе: * Обратите внимание, что вы не можете заставить 'not' возвращать что-либо еще, кроме логического значения! *. –