source

Python 클래스가 개체를 상속하는 이유는 무엇입니까?

factcode 2022. 11. 15. 21:30
반응형

Python 클래스가 개체를 상속하는 이유는 무엇입니까?

다음 클래스 선언이 다음에서 상속되는 이유는 무엇입니까?object

class MyClass(object):
    ...

이 ""에서 가 있습니까?object

Python 3에서는 Python 2와 3의 호환성을 제외하면 아무런 이유가 없습니다.Python 2에는 여러 가지 이유가 있습니다.


Python 2.x 스토리:

2.2 에서는 Python 2.x(2.2 이후)의 에 따라 object「이것들」은 다음과 같습니다.

  1. "time" 스타일 클래스: 그들은object「이것들」은 다음과 같습니다.

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. "새로운" 스타일 클래스: 직접 또는 간접적으로 (빌트인 타입에서 상속 등)object「이것들」은 다음과 같습니다.

    >>> class NewSpam(object):           # directly inherit from object
    ...    pass
    >>> NewSpam.__bases__
    (<type 'object'>,)
    >>> class IntSpam(int):              # indirectly inherit from object...
    ...    pass
    >>> IntSpam.__bases__
    (<type 'int'>,) 
    >>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
    (<type 'object'>,)
    

의심할 여지 없이, 여러분은 수업을 쓸 때 항상 새로운 스타일의 수업을 듣고 싶어할 입니다.이를 통해 얻을 수 있는 혜택은 다음과 같습니다.

  • 디스크립터 지원구체적으로는, 디스크립터를 사용해 다음의 구문을 실시할 수 있습니다.

    1. : 인스턴스가 아닌 암묵적인 인수로 클래스를 받는 메서드classmethod.
    2. staticmethod: 암묵 인수를 수신하지 않는 메서드self첫 번째 논쟁으로
    3. properties with : 속성 가져오기, 설정 및 삭제를 관리하는 함수를 만듭니다.
    4. : 클래스의 메모리 소비량을 절약하고 속성 액세스도 고속화합니다__slots__.물론, 그것은 제한을 가한다.
  • static method:를 사용하면 새 클래스 인스턴스 생성 방법을 사용자 정의할 수 있습니다.

  • 메서드 해결 순서(MRO): 호출할 메서드를 해결할 때 클래스의 기본 클래스가 검색되는 순서를 지정합니다.

  • MRO, 관련또한 슈퍼로 간주됩니다.

object이것들은 잊어버려라.이전 글머리 기호와 "새로운" 스타일의 다른 특전에 대한 자세한 설명은 여기에서 찾을 수 있습니다.

새로운 스타일의 수업의 단점 중 하나는 수업 자체가 더 많은 기억력을 요구한다는 것이다.하지만 당신이 많은 클래스 오브젝트를 만들지 않는 한, 나는 이것이 문제가 될 것이라고 생각하지 않고 긍정적인 것의 바다에 부정적으로 가라앉는다.


Python 3.x 스토리:

Python 3 、 Python 3 、 Python 3 。라고 부릅니다존재하기 때문에, 「클래스」를 추가하는 것에 의 유일한 는, 「클래스」입니다.object8자를 더 입력해야 합니다.이것은, 다음과 같습니다.

class ClassicSpam:
    pass

는 (이름 :-을 제외하고) 다음과 완전히 동일합니다.

class NewSpam(object):
     pass

그리고 여기에는 다음과 같습니다.

class Spam():
    pass

모두 가지고 있다object그들의 차림새로__bases__.

>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]

그럼, 어떻게 해야 할까요?

Python 2의 경우: 항상 에서 명시적으로 상속합니다.특전을 받다.

Python 3의 경우: 상속 위치objectPython에 구애받지 않는 코드를 작성하려면 Python 2와 Python 3에서 모두 작동해야 합니다.그렇지 않으면 Python이 뒤에서 삽입하기 때문에 차이가 없습니다.

파이썬 3

  • class MyClass(object):= 새로운 스타일의 클래스
  • class MyClass:= 신식 클래스 (대부분 계승)object)

파이썬 2

  • class MyClass(object):= 새로운 스타일의 클래스
  • class MyClass:= OLD-STYLE 클래스

설명:

Python 3.x에서 기본 클래스를 정의할 때,object정의에서.단, 이는 추적하기 어려운 문제를 야기할 수 있습니다.

Python은 Python 2.2에서 새로운 스타일의 클래스를 선보였고, 이제 오래된 스타일의 클래스는 매우 오래되었다.구식 클래스에 대한 설명은 2.x 문서에는 포함되어 있지만 3.x 문서에는 존재하지 않습니다.

문제는 Python 2.x의 구식 클래스 구문은 Python 3.x의 새로운 스타일 클래스 구문과 동일하다는 것입니다. Python 2.x는 여전히 매우 널리 사용되고 있으며(예를 들어 GAE, Web2Py), 자신도 모르게 3.x 스타일의 클래스 정의를 2.x 코드로 가져오는 모든 코드(또는 코더)는 심각하게 구식이 되어 버립니다.그리고 구식 수업은 누구의 감시도 받지 않기 때문에, 그들은 무엇이 그들을 때렸는지 모를 것이다.

그러니 그냥 철자를 길게 써서 2.x 개발자가 흘릴 수 있는 수고를 덜어주세요.

예, 이것은 '새로운 스타일' 객체입니다.이것은 python 2.2에서 도입된 기능입니다.

새로운 스타일의 객체는 클래식한 객체와 다른 객체 모델을 가지며, 예를 들어 오래된 스타일의 객체와 함께 제대로 작동하지 않는 객체도 있습니다.super(),@property및 디스크립터.새로운 스타일의 클래스가 무엇인지에 대한 자세한 설명은 이 문서를 참조하십시오.

차이에 대한 설명에 대한 SO 링크:Python의 오래된 스타일과 새로운 스타일의 클래스는 무엇이 다릅니까?

Learn Python the Hard Way의 역사:

Python의 원래 수업 표현은 많은 심각한 방법으로 깨졌다.이 장애가 인식되었을 때는 이미 너무 늦었기 때문에, 서포트할 필요가 있었습니다.이 문제를 해결하기 위해 "이전 클래스"가 계속 작동하도록 하기 위해 "새로운 클래스" 스타일이 필요했지만, 더 정확한 새 버전을 사용할 수 있습니다.

그들은 클래스를 만들기 위해 "오브젝트"라는 단어를 소문자로 구분하여 상속받는 "클래스"로 사용하기로 결정했습니다.혼란스럽지만 클래스는 클래스를 만들기 위해 "object"라는 이름의 클래스에서 상속하지만 실제로는 객체가 아니지만 객체에서 상속하는 것을 잊지 마십시오.

새로운 object class class class from 에서 물려받은 클래스 또는 다른 object:

class NewStyle(object):
    pass

또 다른 예는 다음과 같습니다.

class AnotherExampleOfNewStyle(NewStyle):
    pass

이전 스타일의 기본 클래스는 다음과 같습니다.

class OldStyle():
    pass

올드 스타일의 아동학급은 다음과 같습니다.

class OldStyleSubclass(OldStyle):
    pass

Old Style 기본 클래스는 다른 클래스에서 상속되지 않지만 Old Style 클래스는 물론 서로 상속할 수 있습니다.개체에서 상속하면 모든 Python 클래스에서 특정 기능을 사용할 수 있습니다.새로운 스타일의 클래스가 Python 2.2에 도입되었습니다.

네, 역사적인 일입니다.이것이 없으면 오래된 스타일의 클래스가 생성됩니다.

「 」를 사용하고 type()옛날 스타일의 물건에 대해서는, 「오래된 것」이라고 하는 것이 있습니다.새로운 스타일의 객체에서는 클래스를 얻을 수 있습니다.

클래스 생성 문의 구문:

class <ClassName>(superclass):
    #code follows

,superclass는 항상 Python의 모든 클래스의 루트입니다.

object 는 엄밀히 말하면 Python에서 "새로운 스타일" 클래스의 루트입니다.하지만 오늘날의 새로운 스타일의 수업은 유일한 수업 스타일인 것만큼이나 좋다.

이 말을 요.object때3.으로 Python 3.x를 합니다.object(explicit)은(hell)보다 나은같아요.

언급

언급URL : https://stackoverflow.com/questions/4015417/why-do-python-classes-inherit-object

반응형