2017-12-22 17 views
4

그래서 클래스에서 표준 연산자를 사용하여 내가 무엇을 만들 수 있는지 알아보고 있지만 부울 and 연산자를 편집하는 방법을 찾지 못했습니다.부울 및 연산자 편집

& 연산자를 __and__(self)으로 정의 할 수 있지만 and 동작은 편집 할 수 없습니다. 누구든지 a and b의 동작을 어떻게 바꿀 수 있는지 알고 있습니까? ab은 내가 만들고있는 클래스의 인스턴스입니까?

미리 감사드립니다.

+0

피연산자 유형에 의존하지 않기 때문에 불가능합니다. –

답변

5
파이썬 2, and에서

or 액세스 __nonzero__는 :

>>> class Test(object): 
...  def __nonzero__(self): 
...   print '__nonzero__ called' 
...   return True 
... 
>>> Test() and 1 
__nonzero__ called 
1 

는 파이썬 3에서, __nonzero____bool__로 이름이 바뀌 었습니다. 단락 회로 평가 __nonzero__ 또는 __bool__에 전화를 억제 할 수 있다는

>>> class Test: 
...  def __bool__(self): 
...   print('__bool__ called') 
...   return True 
... 
>>> Test() and 1 
__bool__ called 
1 

참고.

>>> 0 and Test() 
0 
>>> 1 or Test() 
1 

또 다른 전문주의해야 할 파이썬/__bool____nonzero__가 정의되어 있지 __len__ 경우 액세스를 시도한다는 것입니다 및 __len__0 이외의 값을 반환하는 경우 truthy로 오브젝트를 처리합니다. 두 가지 방법이 모두 정의되면 __nonzero__/__bool__이 이깁니다.

>>> class Test: 
...  def __len__(self): 
...   return 23 
... 
>>> Test() and True 
True 
>>> 
>>> class Test: 
...  def __len__(self): 
...   return 23 
...  def __bool__(self): 
...   return False 
... 
>>> Test() and True 
<__main__.Test object at 0x7fc18b5e26d8> # evaluation stops at Test() because the object is falsy 
>>> bool(Test()) 
False 

내가 부울, 말, 같은 bools의 목록이 아닌이 반환 뭔가를 할 수있는 방법이 있습니까?

불행히도, 아니오. documentation이라는 메서드는이어야합니다. False 또는 True을 반환해야하지만 실제로 반환해야 할 경우 TypeError이됩니다.

>>> class Test: 
...  def __bool__(self): 
...   return 1 
... 
>>> Test() and 42 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __bool__ should return bool, returned int 
>>> 
>>> bool(Test()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __bool__ should return bool, returned int 
+0

내가 bool이 아닌 다른 것을 반환 할 수있는 방법이 있습니까? bool 목록이 있습니까? – Dennis

+0

@Dennis가 내 대답을 업데이트했습니다. 간단히 말해서 : 아니오. – timgeb

+1

명확한 답변을 보내 주셔서 감사합니다! – Dennis

4

and 연산자 (초, 다른 제 돌아 반품 first.__bool__()True 경우) __bool__ 부울을 사용하는 제 피연산자들을 변환 후 논리 값에 소정의 동작을한다. 이 동작을 변경할 수있는 방법은 없습니다.

+0

사실'b .__ bool __()'은 결코 호출되지 않을 것입니다. 제 대답에 약간의 부정확 함이있었습니다. –

+0

@pycoder 당신이 실제로 말하길 "처음'.__ bool __()'이'True'이면 두 번째를 반환합니다. * 그러나이 경우에 반환되는 것은 두 번째의 부울입니다. 두 번째 자신이 아닙니다. –

+0

@ev'1 "asdf"== "asdf"' –