> 백엔드 개발 > 파이썬 튜토리얼 > Python 인스턴스에서 특수 메서드를 직접 재정의할 수 없는 이유는 무엇입니까?

Python 인스턴스에서 특수 메서드를 직접 재정의할 수 없는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-28 22:14:11
원래의
804명이 탐색했습니다.

Why Can't I Override Special Methods Directly on Python Instances?

인스턴스에서 특수 메서드 재정의: 탐색

클래스의 인스턴스가 있고 이를 수정하려는 상황을 상상해 보세요. __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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿