Я не могу понять.Почему во втором случае он не пишет: z.__rand__(s)
.
Потому что в этом и заключается смысл обратных операторов.Они также существуют в виде __radd__
, __rsub__
и т. Д.
Если при выполнении a & b
, вызов a.__and__(b)
не существует или возвращает NotImplemented
, он пытается (как«последнее средство») для вызова b.__rand__(a)
.
Подробнее см. в соответствующей части документации Python .
В вашем примере, вероятно, класс z
не реализует __and__
, поэтому возвращается к s
, который поставляет __rand__
.