Python has a very rich set of operators that can be overloaded. From __get__ to __getattr__, __repr__ to __format__, and __complex__ to __iadd__ you can modify almost every behavior of your type. Conspicuously absent however, are the boolean operators.
This is why Django ORM and SQLAlchemy use bitwise & and | to represent SQL and / or.
Let's take a closer look at how the Python compiler treats these operators:
>>> import dis
>>> dis.dis(lambda: a & b)
1 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (b)
6 BINARY_AND
7 RETURN_VALUE
>>> dis.dis(lambda: a and b)
1 0 LOAD_GLOBAL 0 (a)
3 JUMP_IF_FALSE_OR_POP 9
6 LOAD_GLOBAL 1 (b)
>> 9 RETURN_VALUE
Not only can you not override the and operator, the Python VM doesn't even have an opcode for it.
In return, Python gives you the semantics that a or b returns not True or False, but either a or b (or False if neither is truthy).