복붙노트

[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. ==============================

    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. ==============================

    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.파이썬 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. ==============================

    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`
        ...
    

    풍모:

  5. from https://stackoverflow.com/questions/2825364/final-classes-in-python-3-x-something-guido-isnt-telling-me by cc-by-sa and MIT license