2015-08-31 1 views
3

Я был под впечатлением, что можно было перегрузить and в Python, но, прочитав сейчас документы, я понял, что __and__ относится к поразрядному оператору &, а не к логическому and.Можно ли перегрузить логический и в Python?

Я что-то пропускаю, или невозможно перегрузить логический and в Python?

+0

Мне любопытно: что бы вы хотели сделать перегруженным 'и' делать? Или вы просто просите чисто теоретические причины? –

+0

Чисто теоретический. Я пишу что-то, что нужно для работы с Python AST. Для большинства вещей, таких как 'Добавить', я заменяю его вызовом' __add__', но я был удивлен, что не смог найти функцию для замены узла «И» в AST. – ArtOfWarfare

+0

Я не вижу веской причины, по которой вы хотели бы ввести пользовательское поведение для логических операторов, которое не соответствует поведению при оценке '__bool__'. – poke

ответ

4

Нет, это невозможно. Существует proposal, который добавляет эту функциональность, но пока ее отклоняют.

2

Нет, это невозможно. См. here.

+0

Hm. 'is' имеет для меня какой-то смысл, но я удивлен, что' and' и 'or' не могут быть перегружены. – ArtOfWarfare

+0

Да, это действительно ограничение языка. Но вы * можете * переопределить побитовые операторы & и | , как вы заметили. Это используется, например, SQLAlchemy, и вы тоже можете использовать его самостоятельно. – rkrzr

2

Нет прямого способа сделать это. Вы можете переопределить __nonzero__ для ваших объектов, чтобы изменить их значение истины.

class Truth: 

    def __init__(self, truth): 
     self.truth = truth 

    def __nonzero__(self): 
     return self.truth 

t = Truth(True) 
f = Truth(False) 

print bool(t and t) 
print bool(t and f) 
print bool(f and f) 
+1

Совет по совместимости: '__nonzero__' был переименован в [' __bool__'] (https://docs.python.org/3.5/reference/datamodel.html?highlight=nonzero#object.__bool__) в 3.X. – Kevin