인스턴스에서 특수 메서드 재정의: 탐색
클래스의 인스턴스가 있고 이를 수정하려는 상황을 상상해 보세요. __repr__()과 같은 특수 메서드. 이러한 메서드를 재정의하려고 시도하면 예기치 않은 동작이 발생할 수 있습니다.
이를 설명하려면 다음 코드를 고려하세요.
class A(object): pass def __repr__(self): return "A" from types import MethodType a = A()
repr(a)를 호출할 때 "A"를 얻을 것으로 예상됩니다. ," repr이 재정의된 경우입니다. 그러나 결과는 예상과 다릅니다.
이러한 불일치는 Python의 특수 메서드 호출 방식에서 비롯됩니다. 일반적으로 Python은 인스턴스가 아닌 클래스 자체에서만 특수 메서드를 실행합니다. 결과적으로 repr을 인스턴스에 직접 덮어쓰는 것은 효과적이지 않습니다.
이 제한을 극복하려면 다음 접근 방식을 고려하십시오.
class A(object): def __repr__(self): return self._repr() def _repr(self): return object.__repr__(self)
이 수정된 코드에서 인스턴스의 repr을 대체하여 덮어쓸 수 있습니다. _repr().
이 동작을 다음 코드 조각과 대조하면 특수 메서드 재정의와 일반 메서드 간의 차이점을 알 수 있습니다.
class A(object): def foo(self): return "foo" def bar(self): return "bar" a = A() setattr(a, "foo", MethodType(bar, a, a.__class__))
이 경우 foo 인스턴스에서 특수 메서드가 성공적으로 재정의되었습니다. 그러나 이 기능은 일반적인 방법에만 적용된다는 점을 기억하는 것이 중요합니다.
위 내용은 Python 인스턴스에서 특수 메서드를 직접 재정의할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!