-
연산자 OverloadingToday_I_Learned/Python 2021. 1. 27. 16:01
class Number: def __init__(self): self.memNum = 1 def __iadd__(self, val): tmp = self.memNum + val self.memNum = tmp return self aaa = Number() bbb = 5 aaa += bbb print(aaa.memNum) >>> 6 ################################################# class Number: def __init__(self): self.memNum = -1 def __getitem__(self, item): self.memNum = item return self def __iadd__(self, val): tmp = self.memNum + val self.memNum = tmp return self aaa = Number() bbb = 5 aaa[1] += bbb print(aaa.memNum) >>>(생략).... >>> aaa[1] += bbb >>>TypeError: 'Number' object does not support item assignment
'+=' 연산자를 Overload 하다가 이상한 점 발견.
그냥 객체로 overload한 __iadd__ (= '+=' 연산자)를 호출하면 잘 실행이 되는데
__getitem__ 을 Overload하여 self(객체 자신)을 return하게 하고 바로 __iadd__ (overloaded)를 호출하면 TypeError가 발생한다.
Error message를 검색해보니 immutable한 객체에 = 를 이용하여 값을 변경하려고 할 때 발생하는 것이란다.
직접 생성한 객체도 immutable해서 그렇다는데 그럼 그냥 aaa += bbb가 잘 실행되었던 것은 어떤 이유인지...
aaa += bbb 와
aaa[1] += bbb의 차이를 찾는 중....
'Today_I_Learned > Python' 카테고리의 다른 글
class method vs. static method (1) 2023.09.26 이터레이터 iterator (0) 2023.09.17 Python3 Scapy에 Read할 수 있는 Packet Header 추가하기(Scapy-2.4.3) (0) 2021.02.15 __new__, __init__, __call__ Magic method 정리 (0) 2021.01.15 Python3 locals() (0) 2021.01.13