`super(BooleanFunction, cls)` calls a superclass of `BooleanFunction`(*), not `BooleanFunction` itself. To call `BooleanFunction`, you need `super(Not, cls)`.

But reusing the implementation in `BooleanFunction.eval` isn't that useful anyway. Reimplementing it is just 2 lines and would allow to avoid the potentially costly printing of the argument.

(*): with multiple inheritance, it's actually more complicated than that. `super(BooleanFunction, cls).eval` actually finds the first class that implements `eval` and comes after `BooleanFunction` in the MRO of `cls`.