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).
