__add __ (및 기타 매직 메서드)를 동적으로 정의 [중복]
Nov 24 2020
그 들었어요 a + b
로 확장을 a.__add__(b)
. 그러나 내 코드에서는 그렇게 작동하지 않습니다. 이 코드를 사용하십시오.
class TestAdd:
def __init__(self, a):
self.a = a
def __getattr__(self, name):
if name == '__add__':
return (lambda y: self.a + y)
을 시도하면 TestAdd(5).__add__(1)
6이 올바르게 반환됩니다. 을 시도 TestAdd(5) + 1
하면 다음 오류가 발생합니다.
TypeError Traceback (most recent call last)
<ipython-input-3-1c04c7082b89> in <module>
----> 1 TestAdd(5) + 1
TypeError: unsupported operand type(s) for +: 'TestAdd' and 'int'
왜 이런거야? 내가 뭔가를 놓치고 있습니까?
답변
chepner Nov 24 2020 at 03:11
매직 메서드는 인스턴스가 아니라 클래스에서 조회됩니다. TestAdd(5) + 1
는보다 정확하게 tmp = TestAdd(5); TestAdd.__add__(tmp, 1)
이며 정의하지 않았습니다 TestAdd.__add__
.
AKX Nov 24 2020 at 03:10
__getattr__
매직 메서드를 동적으로 반환하는 데 사용할 수 없습니다 . 이것은 매뉴얼의 3.3.10 특수 메서드 조회 에 자세히 설명되어 있습니다.