나는이 연산자에 대한 마법 메서드를 사용하여 bool 이진 연산을 만들고 싶습니다. 예를 들어 a < b
을 getattr(a, '__lt__')(b)
또는 a == b
을 getattr(a, '__eq__')(b)
으로 설정할 수 있습니다."is"와 "in"연산자에 대한 마법 메서드의 이름은 무엇입니까?
그런 식으로 a in b
과 a is b
을 얻을 수 있습니까?
나는이 연산자에 대한 마법 메서드를 사용하여 bool 이진 연산을 만들고 싶습니다. 예를 들어 a < b
을 getattr(a, '__lt__')(b)
또는 a == b
을 getattr(a, '__eq__')(b)
으로 설정할 수 있습니다."is"와 "in"연산자에 대한 마법 메서드의 이름은 무엇입니까?
그런 식으로 a in b
과 a is b
을 얻을 수 있습니까?
in
은 __contains__
이고 is
은 dunder 메소드가 없습니다. 난 강력하게 당신이 operator
module의 기능을 사용하는 것이 좋습니다 : __contains__
이 __iter__
및 __getitem__
되는 정의되지 않은 경우
a < b => operator.lt(a, b)
a == b => operator.eq(a, b)
a in b => operator.contains(a, b)
a is b => operator.is_(a, b)
in
의 경우 정확한 dunder 메서드는 __contains__
입니다.
is
에 대한 방법은 id(a) == id(b)
과 같기 때문에이 방법이 없습니다. 이것은 파이썬에 의해 두포에서 사용 된 실제 객체 ID를 비교하므로 객체 내용이 아닌 객체 ID를 비교하는 데 사용됩니다. 클래스 내에서 그것을 덮어 쓰면 파이썬의 객체 모델이 깨질 수 있으므로 허용되지 않습니다.
__contains__
가을 백 옵션, in
에 대한 올바른 것입니다.
에 getattr
을 사용해야하는 이유는 무엇입니까? is
은 에 대해 "정의"되어 있습니다. 모든 객체가 파이썬에 있습니다. operator._is
또는 (시도 및 실패) getattr
을 거칠 필요가 없습니다.
See the documentation on built-in types :
이을 사용자 정의 할 수없는
is
및is not
사업자의 동작; 은 두 개의 객체에 적용될 수 있으며 예외를 발생시키지 않습니다.
(강조 광산)
단지 기능을 잡고 getattr(a, "function")(b)
를 사용하여 전화 사용자가 제공 한 조각에 따르면, 당신은 이미 당신이 평가하는 데 필요한 개체의 이름이 바로 is
를 사용 바로; 항상 사용할 수 있습니다.
왜 '연산자'모듈이 일반적인 방식보다 더 좋을까요? –
연산자의 함수 버전이 필요한 경우 연산자 모듈이 dunder 메서드에 액세스하거나 자체 래퍼를 작성하는 것보다 낫습니다. –
'getattr (a, '__lt __') (b)'함수 버전을 찾고있는'a