사용자 정의 메서드 및 속성을 사용하여 내장 Python 유형 확장
Python에서는 내장된 확장을 원하는 시나리오에 직면할 수 있습니다. 추가 메소드나 속성이 있는 유형. 그러나 이러한 유형을 직접 변경하는 것은 허용되지 않습니다.
예를 들어 JavaScript에서 설명한 대로 dict 유형에 helloWorld() 메서드를 추가하려고 하면 이러한 접근 방식이 지원되지 않는다는 것을 알 수 있습니다.
하위 클래스화 및 네임스페이스 대체를 사용한 해결 방법
원래 유형을 직접 확장할 수는 없지만 영리한 해결 방법이 있습니다. 대상 유형을 하위 클래스로 분류한 후 내장/전역 네임스페이스 내에서 이를 대체하면 원하는 동작을 효과적으로 모방할 수 있습니다.
다음은 Python의 구현입니다.
# Built-in namespace
import __builtin__
# Extended subclass
class mystr(str):
def first_last(self):
if self:
return self[0] self[-1]
else:
return ''
# Substitute the original str with the subclass on the built-in namespace
__builtin__.str = mystr
print(str(1234).first_last()) # 14
print(str(0).first_last()) # 00
print(str('').first_last()) # ''
# Note that objects created by literal syntax will not have the extended methods
print('0'.first_last()) # AttributeError: 'str' object has no attribute 'first_last'
이 예에서 mystr 하위 클래스는 first_last() 메서드를 추가하여 str 유형을 확장합니다. __builtin__.str 할당은 모든 내장 str 호출을 수정된 하위 클래스를 대신 사용하도록 리디렉션합니다. 결과적으로 내장 str() 생성자로 인스턴스화된 객체는 이제 first_last() 메서드를 소유합니다.
그러나 리터럴 구문('문자열')을 사용하여 생성된 객체는 다음의 인스턴스로 유지된다는 점에 유의하는 것이 중요합니다. 수정되지 않은 str 유형이며 사용자 정의 메소드를 상속하지 않습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3