[PYTHON] 파이썬 3.x의 최종 수업 - 귀도가 나에게 말하지 않는 것?
PYTHON파이썬 3.x의 최종 수업 - 귀도가 나에게 말하지 않는 것?
이 질문은 많은 가정의 위에 만들어집니다. 한 가정이 틀린다면, 모든 것이 넘어집니다. 나는 여전히 Python에 처음으로 익숙하며 흥미롭고 탐험적인 단계에 접어 들었습니다.
파이썬이 서브 클래 싱 할 수없는 클래스 (최종 클래스) 생성을 지원하지 않는다는 것을 이해합니다. 그러나 파이썬의 bool 클래스는 서브 클래 싱 될 수 없다고 생각됩니다. 이것은 bool 클래스의 의도가 고려 될 때 (bool은 true와 false의 두 값만 있기 때문에) 이해할 수 있습니다. 그 점에 만족합니다. 제가 알고 싶은 것은이 수업이 어떻게 최종으로 표시되었는지입니다.
그래서 제 질문은 : 귀도가 bool의 하위 클래스 화를 막기 위해 얼마나 정확하게 관리 했습니까?
>>> class TestClass(bool):
pass
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
class TestClass(bool):
TypeError: type 'bool' is not an acceptable base type
관련 질문 : 파이썬에서 bool을 확장 할 수없는 이유는 무엇입니까?
해결법
-
==============================
1.Python 3.x에서 동일한 효과를 아주 쉽게 시뮬레이션 할 수 있습니다.
Python 3.x에서 동일한 효과를 아주 쉽게 시뮬레이션 할 수 있습니다.
class Final(type): def __new__(cls, name, bases, classdict): for b in bases: if isinstance(b, Final): raise TypeError("type '{0}' is not an acceptable base type".format(b.__name__)) return type.__new__(cls, name, bases, dict(classdict)) class C(metaclass=Final): pass class D(C): pass
다음 출력을 제공합니다.
Traceback (most recent call last): File "C:\Temp\final.py", line 10, in <module> class D(C): pass File "C:\Temp\final.py", line 5, in __new__ raise TypeError("type '{0}' is not an acceptable base type".format(b.__name__)) TypeError: type 'C' is not an acceptable base type
-
==============================
2.C API를 통해서만이 작업을 수행 할 수 있습니다. 형식 개체의 tp_flags 중 Py_TPFLAGS_BASETYPE 비트를 지 웁니다.
C API를 통해서만이 작업을 수행 할 수 있습니다. 형식 개체의 tp_flags 중 Py_TPFLAGS_BASETYPE 비트를 지 웁니다.
이렇게 : http://svn.python.org/projects/python/trunk/Objects/boolobject.c (Py_TPFLAGS_BASETYPE가 설정된 intobject.c).
-
==============================
3.파이썬 3.6에서는 다음과 같이 메타 클래스를 사용하지 않고 하위 클래스를 차단할 수 있습니다.
파이썬 3.6에서는 다음과 같이 메타 클래스를 사용하지 않고 하위 클래스를 차단할 수 있습니다.
class SomeBase: def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) if cls is not SomeBase: raise TypeError("SomeBase does not support polymorphism. Use composition over inheritance.") class Derived(SomeBase): pass
-
==============================
4.우리는 그저 할 수있는 작은 도서관이 있습니다! https://github.com/wemake-services/final-class
우리는 그저 할 수있는 작은 도서관이 있습니다! https://github.com/wemake-services/final-class
from final_class import final @final class Example(object): # You won't be able to subclass it! ... class Error(Example): # Raises `TypeError` ...
풍모:
from https://stackoverflow.com/questions/2825364/final-classes-in-python-3-x-something-guido-isnt-telling-me by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python AttributeError : 'module'객체에 'SSL_ST_INIT'속성이 없습니다. (0) | 2018.10.30 |
---|---|
[PYTHON] Sphinx autodoc-skip-member를 내 함수에 연결하십시오. (0) | 2018.10.30 |
[PYTHON] 파이썬에서리스트 객체를 상속하고 확장하는 방법은? (0) | 2018.10.30 |
[PYTHON] 파이썬 플롯에서 그리스 문자 등 입력 (0) | 2018.10.30 |
[PYTHON] ssh를 통해 tkinter를 사용하는 표시 이름 및 $ DISPLAY 환경 변수 없음 [duplicate] (0) | 2018.10.30 |