IT박스

Python에서 "+ ="를 재정의 하시겠습니까?

itboxs 2020. 11. 30. 07:57
반응형

Python에서 "+ ="를 재정의 하시겠습니까? (__iadd __ () 메서드)


파이썬에서 + =를 재정의 할 수 있습니까?


예, __iadd__메서드를 재정의합니다 . 예:

def __iadd__(self, other):
    self.number += other.number
    return self    

위의 답변에 올바르게 제공된 것 외에도을 __iadd__재정의하면 x += y작업이 __iadd__메서드 의 끝으로 끝나지 않는다는 것을 명시 적으로 설명 할 가치 가 있습니다 .

대신 x = x.__iadd__(y). 즉, Python __iadd__은 구현이 완료된 후 "추가하는"객체에 구현 의 반환 값을 할당합니다 .

이는 x += y최종 암시 적 단계가 실패하도록 작업 의 왼쪽을 변경할 수 있음을 의미 합니다. 목록에있는 항목에 추가 할 때 발생할 수있는 일을 고려하십시오.

>>> x[1] += y # x has two items

이제 __iadd__구현 (에서 객체의 메서드 x[1])이 잘못되거나 의도적으로 x[0]목록의 시작 부분에서 첫 번째 항목 ( )을 제거하면 Python은 __iadd__메서드 를 실행 하고 반환 값을에 할당하려고합니다 x[1]. 더 이상 존재하지 않는 (에있을 것임 x[0]) ÌndexError.

또는 위의 예의 __iadd__시작 부분에 무언가를 삽입 하면 x객체는 x[2], not x[1]가되며 이전에 있던 모든 항목은 x[0]이제에 있으며 호출 x[1]의 반환 값이 할당 __iadd__됩니다.

누군가가 무슨 일이 일어나고 있는지 이해하지 못한다면 그 결과로 생긴 버그는 고치기에 악몽이 될 수 있습니다.


오버로딩 __iadd__(self를 반환하는 것을 잊지 마십시오!) __add__외에도 x + = y가 x = x + y처럼 작동하므로에서 폴백 할 수도 있습니다 . (이것은 + = 연산자의 함정 중 하나입니다.)

>>> class A(object):
...   def __init__(self, x):
...     self.x = x
...   def __add__(self, other):
...     return A(self.x + other.x)
>>> a = A(42)
>>> b = A(3)
>>> print a.x, b.x
42 3
>>> old_id = id(a)
>>> a += b
>>> print a.x
45
>>> print old_id == id(a)
False

심지어 전문가를 괴롭 힙니다 .

class Resource(object):
  class_counter = 0
  def __init__(self):
    self.id = self.class_counter
    self.class_counter += 1

x = Resource()
y = Resource()

어떤 값을 사용하면 기대 x.id, y.id그리고 Resource.class_counter가지고?


http://docs.python.org/reference/datamodel.html#emulating-numeric-types

예를 들어 x + = y 문을 실행하려면 x는 __iadd __ () 메서드가있는 클래스의 인스턴스입니다. x .__ iadd __ (y)가 호출됩니다.

참고 URL : https://stackoverflow.com/questions/1047021/overriding-in-python-iadd-method

반응형