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
'IT박스' 카테고리의 다른 글
작은 C # 코드를 빠르게 코딩하고 실행하는 방법 (0) | 2020.11.30 |
---|---|
Django에서 데이터베이스 뷰를 모델로 사용할 수 있습니까? (0) | 2020.11.30 |
데이터 유효성을 검사 할 때 예외를 던지는 것이 좋은 생각입니까, 나쁜 생각입니까? (0) | 2020.11.30 |
반복보다 재귀를 선호해야하는 이유는 무엇입니까? (0) | 2020.11.30 |
좋아하는 Kohana 팁 및 기능? (0) | 2020.11.30 |