переопределить встроенные "и" - PullRequest
3 голосов
/ 28 марта 2011

можно ли переопределить примитив "и"?например, если я попытаюсь сделать что-то вроде этого

class foo():
    def __and__(self,other):
          return "bar"

, будет выведено

>> foo() and 4
4
>> foo().__and__(4)
'bar'

моя интуиция заключается в том, что встроенное и не может быть переопределено и не должно быть переопределеновызывает путаницу.

Я полагаю, что и функция не должна быть изменена, потому что это не должно быть, так как она ведет себя как

def and(self,other):
    if( not bool(self) ):
           return self
    else:
           return other

Ответы [ 3 ]

7 голосов
/ 28 марта 2011

__and__ переопределяет побитовый оператор &, а не логический оператор.

Чтобы обеспечить логическую обработку вашего класса, определите метод __nonzero__: http://docs.python.org/reference/datamodel.html#object.__nonzero__

2 голосов
/ 28 марта 2011

Оператор and не может быть переопределен, так как он не всегда оценивает оба своих операнда. Невозможно предоставить функцию, которая может делать то, что она делает, аргументы функций всегда полностью оцениваются перед вызовом функции. То же самое касается or.

1 голос
/ 28 марта 2011

Boolean and и or не могут быть переопределены в Python.Это правда, что они имеют особое поведение (короткое замыкание, такое, что оба операнда не всегда оцениваются), и это как-то связано с тем, почему они не могут быть переопределены.Тем не менее, это (ИМХО) не вся история.

На самом деле, Python может обеспечить средство, которое поддерживает короткое замыкание, при этом позволяя операторам and и orбыть переопределенным;это просто не делает этого.Это может быть преднамеренным выбором, чтобы сохранить простоту, или потому, что есть другие вещи, которые разработчики Python считают более полезными для разработчиков, и вместо этого работают над ними.

Однако это выборчасть дизайнеров Python, а не закон природы.

...