2011-03-28 6 views
3

기본 수 "및"재정의 할 수 있습니까? 예를 들어 나는이 출력됩니다이내장 "및"

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

처럼 뭔가를하려고하면

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

내 직감이 (가)에 건설하고 재정의 할 수 없습니다 및 혼란을 유발하지 오버라이드 (override)하지 말아야한다는 것입니다.

은 내가 추측하고있을 필요하지 않기 때문에 그것은 비트 연산자 & 아닌 논리 연산자를 대체

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

답변

2

and 연산자를 재정의 할 수 없습니다 :

정의하는 __nonzero__ 방법을 클래스 부울 논리 처리를 제공합니다. 기능을 수행 할 수있는 함수를 제공 할 수있는 방법이 없으며 함수에 대한 인수는 함수가 호출되기 전에 항상 완전히 평가됩니다. or도 마찬가지입니다.

+0

두 피연산자가 평가되지 않은 경우를 제공 할 수 있습니까? 나는 하나를 생각할 수 없다. – Doboy

+1

'x = 거짓 및 foo()'. 'print' 문을 포함하도록'foo()'를 쓰면 결코 호출되지 않는다는 것을 쉽게 볼 수 있습니다. 부울'and'는 피연산자 중 하나가 거짓이면 참이 될 수 없으므로'and'가 첫 번째 피연산자가'False' 인 경우 두 번째 피연산자를 평가하지 않습니다. '또는'이 다른 방법입니다. 첫 번째 피연산자가 '참'이면 두 번째 연산은 평가할 필요가 없습니다. 이것은 단락으로 알려져 있으며, 부작용은 때로는 자체적으로 사용됩니다 : 예를 들어'arg = arg or default'는'arg'가 비어 있으면 0으로, 또는 '없음'. – kindall

1

부울 andor은 파이썬에서 덮어 쓸 수 없습니다. 특별한 동작 (두 피연산자가 항상 평가되지는 못하도록 단락)이 있으며이 문제가 재정의 할 수없는 이유와 관련이 있습니다. 그러나 이것은 (IMHO) 전체 이야기가 아닙니다. 사실

, 파이썬 여전히 andor 사업자 오버라이드 (override) 할 수 있도록하면서 단락을 지원하는 기능을 제공 할 수있다; 그것은 단순히 그렇게하지 않습니다. 이것은 단순하게 유지하려는 고의적 인 선택 일 수도 있고, 파이썬 개발자들이 개발자에게 더 유용하다고 생각하는 대신 다른 것들이 필요하기 때문일 수도 있습니다.

그러나 파이썬 디자이너의 입장에서는 자연의 법칙이 아닙니다.