programing

하위 분류할 수 없는 클래스는 무엇입니까?

bestprogram 2023. 5. 2. 23:02

하위 분류할 수 없는 클래스는 무엇입니까?

기본 제공 및 표준 라이브러리 클래스가 하위 분류("최종")되지 않는 규칙이 있습니까?

Python 3.3 이후의 몇 가지 예는 다음과 같습니다.

  • bool
  • function
  • operator.itemgetter
  • slice

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

저는 애초에 수업이 "최종"으로 선택된 이유가 무엇인지 이해하고 싶습니다.

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

클래스 불변성 위반

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

  • bool:True,FalseGuido 댓글 보기
  • NoneType:None
  • NotImplementedType:NotImplemented
  • ellipsis:Ellipsis

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

설득력 있는 사용 사례 없음

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

참고 1:

저는 원래 유효한 사용 사례가 있다고 생각했지만, 단순히 하위 분류에 대한 관심이 부족했습니다.function그리고.operator.itemgetter여기와 여기에서 제공되는 사용 사례가 설득력이 없다고 지적해 준 @agf에 감사드립니다(질문에 대한 @agf 의견 참조).

참고 2:

걱정되는 것은 다른 Python 구현이 실수로 CPython에서 마지막인 클래스를 하위 분류할 수 있다는 것입니다.이로 인해 휴대할 수 없는 코드가 발생할 수 있습니다(사용 사례가 약할 수 있지만 누군가가 하위 분류 코드를 작성할 수 있음).functionPython이 지원하는 경우).이 문제는 Python 문서에서 하위 분류할 수 없는 모든 내장 및 표준 라이브러리 클래스를 표시하고 모든 구현이 CPython 동작을 따르도록 요구함으로써 해결할 수 있습니다.

참고 3:

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

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

이 주제에 대한 많은 질문들이 보여주듯이 그것은 꽤 모호합니다.문서에 최종 수업을 설명하는 단락을 추가하고 오류 메시지를 다음으로 변경하는 제안을 제출하겠습니다.

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

기본 제공 기능을 확인하는 경우(오류, dunder 메서드, 경고 제외, 필요한 경우 포함할 수도 있음)

import keyword, re
x = sorted([i for i in list(keyword.__builtins__) if not re.search('.*Error|Warning|__', i)], key=len)

그리고 도망가,

l1 = []
l2 = []
for i in x:
  try:
    A = type('A', (eval(i),), {})
    l1.append(i)
  except TypeError:
    l2.append(i)

그리고나서,

l1

기브즈,

['int', 'map', 'set', 'str', 'zip', 'dict', 'list', 'type', 'bytes', 'float',
 'super', 'tuple', 'filter', 'object', 'complex', 'property', 'reversed',
 'bytearray', 'enumerate', 'frozenset', 'Exception', 'SystemExit',
 'classmethod', 'staticmethod', 'BaseException', 'StopIteration',
 'GeneratorExit', 'KeyboardInterrupt', 'StopAsyncIteration']

하는 동안에,

l2

기브즈,

['id', 'abs', 'all', 'any', 'bin', 'chr', 'dir', 'hex', 'len', 'max', 'min',
 'oct', 'ord', 'pow', 'sum', 'eval', 'exec', 'hash', 'iter', 'next', 'repr',
 'vars', 'None', 'True', 'bool', 'open', 'help', 'ascii', 'input', 'print',
 'round', 'False', 'range', 'slice', 'divmod', 'format', 'locals', 'sorted',
 'compile', 'delattr', 'getattr', 'globals', 'hasattr', 'setattr', 'credits',
 'license', 'display', 'runfile', 'dreload', 'callable', 'Ellipsis', 'execfile',
 'copyright', 'breakpoint', 'isinstance', 'issubclass', 'memoryview',
 'get_ipython', 'NotImplemented']

l1기본 클래스로 작동할 수 있는 기본 제공 항목이 포함되어 있습니다.

언급URL : https://stackoverflow.com/questions/10061752/which-classes-cannot-be-subclassed