__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 특수 메서드 조회 에 자세히 설명되어 있습니다.