Nice programing

서브 클래 싱 할 수없는 클래스는 무엇입니까?

nicepro 2020. 10. 30. 21:01
반응형

서브 클래 싱 할 수없는 클래스는 무엇입니까?


어떤 내장 및 표준 라이브러리 클래스가 서브 클래 싱 할 수 없는지 ( "최종") 규칙이 있습니까?

Python 3.3부터 다음은 몇 가지 예입니다.

  • bool
  • function
  • operator.itemgetter
  • slice

C와 순수 파이썬 모두에서 "최종"클래스의 구현을 다루는 질문찾았습니다 .

나는 어떤 이유로 수업이 처음에 "최종"으로 선택되는 이유를 설명하고 싶습니다.


파이썬에서 클래스가 "최종"이되는 데에는 두 가지 이유가있는 것 같습니다.

1. Class Invariant 위반

Singleton 패턴을 따르는 클래스에는 제한된 (미리 결정된) 인스턴스 수가 있다는 불변성이 있습니다. 하위 클래스에서이 불변의 위반은 클래스의 의도와 일치하지 않으며 올바르게 작동하지 않습니다. 예 :

  • bool: True, False; 참조 귀도 님의 댓글
  • NoneType: None
  • NotImplementedType: NotImplemented
  • ellipsis: Ellipsis

이 카테고리에는 싱글 톤 패턴 이외의 경우가있을 수 있지만 저는 전혀 알지 못합니다.

2. 설득력있는 사용 사례 없음

C로 구현 된 클래스는 서브 클래 싱을 허용하기 위해 추가 작업이 필요합니다 (적어도 CPython에서). 설득력있는 사용 사례없이 이러한 작업을 수행하는 것은 그다지 매력적이지 않으므로 자원 봉사자가 앞으로 나올 가능성이 적습니다. 예 :

참고 1 :

원래 유효한 사용 사례가 있다고 생각했지만 function및의 하위 클래스 화에 대한 관심이 충분하지 않습니다 operator.itemgetter. 여기여기에 제공된 사용 사례 가 설득력이 없다는 점을 지적 해 주신 @agf에게 감사드립니다 (질문에 대한 @agf 주석 참조).

노트 2:

내 우려는 또 다른 Python 구현이 CPython에서 최종 클래스의 하위 클래스를 실수로 허용 할 수 있다는 것입니다. 이로 인해 이식 불가능한 코드가 발생할 수 있습니다 (사용 사례는 약할 수 있지만 functionPython이 지원하는 경우 하위 클래스를 만드는 코드를 작성할 수 있습니다 ). 이것은 파이썬 문서에서 서브 클래 싱 할 수없는 모든 내장 및 표준 라이브러리 클래스를 표시하고 모든 구현이 해당 측면에서 CPython 동작을 따르도록 요구함으로써 해결할 수 있습니다.

노트 3:

위의 모든 경우에 CPython이 생성 한 메시지는 다음과 같습니다.

TypeError: type 'bool' is not an acceptable base type

이 주제에 대한 수많은 질문이 보여 주듯이, 그것은 매우 모호합니다. 최종 클래스를 설명하는 문서에 단락을 추가하라는 제안을 제출하고 오류 메시지를 다음과 같이 변경할 수도 있습니다.

TypeError: type 'bool' is final (non-extensible)

참고 URL : https://stackoverflow.com/questions/10061752/which-classes-cannot-be-subclassed

반응형