ProgramingTip

Python 클래스는 객체를 상속합니다.

bestdevel 2020. 9. 27. 13:19
반응형

Python 클래스는 객체를 상속합니다.


클래스 선언이 상속 할 이유가 object있습니까?

방금이 작업을 수행하는 코드를 찾았는데 그 이유를 찾았습니다.

class MyClass(object):
    # class code follows...

클래스 선언이 상속 할 이유가 object있습니까?

Python 3에서는 Python 2와 3 제외하고는 없습니다 . Python 2에서는 여러 가지 이유가 있습니다.


Python 2.x 스토리 :

Python 2.x (2.2 이후 버전)에는 object기본 클래스 의 존재 여부에 따라 두 가지 스타일의 클래스가 있습니다.

  1. "클래식"스타일 클래스 : 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. 와 속성 : 속성 의 가져 오기, 설정 및 삭제를 관리하는 함수를 작성합니다 .property
    4. __slots__: 클래스의 메모리 소비를 절약하고 속성 액세스를 더 빠르게합니다. 물론 제한이 있습니다.
  • __new__정적 방법 : 당신은 클래스 인스턴스가 생성되는 방법을 새 사용자 정의 할 수 있습니다.

  • MRO (Method Resolution Order) : 호출 할 메소드를 확인하려고 할 때 클래스의 기본 클래스가 검색되는 순서입니다.

  • MRO 관련, super호출합니다 . 또한 super()슈퍼로 제공됩니다.

에서 상속하지 object않는 버리십시오. "새로운"스타일 클래스의 다른 특전과 함께 이전 글 머리 기호에 대한 자세한 설명은 여기 에서 사용할 수 있습니다 .

새로운 스타일 클래스의 단점 중 하나는 클래스 자체가 더 많은 메모리를 요구하는 것입니다. 그래도 많은 클래스 수업을 생성하지 않는 한, 이것이 긍정적 인 바다에 영향을 미칠 것 같지 않습니다.


Python 3.x 스토리 :

Python 3에서는 모든 것이 단순화됩니다. 새로운 스타일의 클래스 만 존재 (일반적으로 클래스라고 함) 추가 할 때의 유일한 차이점 object은 8 튼 더 입력해야한다는 것입니다. 이 :

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]

그래서 어떻게해야해야합니까?

파이썬 2 : 항상 object명시 적으로 . 특전을 받으세요.

파이썬 3에서는 파이썬에object받지 않는 코드 구애를 작성 하는 경우 상속 합니다. 즉, Python 2와 Python 3에서 모두 작동해야합니다. 거기에없는 경우에는 파이썬이 삽입되어 실제로 차이가 없습니다. 무대 뒤에서.


확실히 3

  • class MyClass(object): = 새로운 스타일의 수업
  • class MyClass:= 새 스타일 클래스 (에서 암시 적으로 상 속됨 object)

확실히 2

  • class MyClass(object): = 새로운 스타일의 수업
  • class MyClass:= 구식 클래스

설명:

Python 3.x에서 기본 클래스를 정의 할 때 정의에서를 삭제할 수 object있습니다. 그러나 이것은 심각하게 추적하기 어려운 문제에 대한 문을 열 수 있습니다.

파이썬은 파이썬 2.2에서 새로운 스타일의 클래스를 도입했으며, 지금까지 구식 클래스는 정말 오래되었습니다. 구식 클래스에 대한 논의는 2.x 문서에 묻혀 있고 3.x 문서에는 존재하지 않습니다.

문제는 Python 2.x의 이전 스타일 클래스의 구문이 Python 3.x의 새 스타일 클래스의 대체 구문과 동일하다는 것 입니다. Python 2.x는 여전히 매우 널리 사용되며 (예 : GAE, Web2Py), 3.x 스타일의 클래스 정의를 2.x 코드로 무의식적으로 가져 오는 모든 코드 (또는 코더)는 심각하게 오래된 기본 개체로 끝날 것입니다. 그리고 구식 수업이 누구의 레이더에 있지 않기 때문에 그들은 자신을 공격 한 것이 무엇인지 알지 못할 것입니다.

그러니 먼 길을 철자하고 2.x 개발자의 눈물을 구하십시오.


예, 이것은 '새로운 스타일'개체입니다. python2.2에 도입 된 기능입니다.

새 스타일 객체는 클래식 객체와 다른 객체 모델을 가지며, 예를 들어 super(), @property및 설명자 와 같은 일부 항목은 이전 스타일 객체에서 제대로 작동하지 않습니다 . 새로운 스타일 클래스가 무엇인지에 대한 좋은 설명은 이 기사참조하십시오 .

차이점에 대한 설명을위한 링크 : Python에서 이전 스타일과 새 스타일 클래스의 차이점은 무엇입니까?


Learn Python the Hard Way의 역사 :

Python의 원래 클래스 표현은 여러 가지 심각한 방식으로 깨졌습니다. 이 결함이 인식 될 무렵에는 이미 너무 늦었고 지원해야했습니다. 문제를 해결하기 위해 "이전 클래스"가 계속 작동하도록 "새 클래스"스타일이 필요했지만 더 정확한 새 버전을 사용할 수 있습니다.

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

또한 새 스타일 클래스와 이전 스타일 클래스의 차이점을 알려 드리기 위해 새 스타일 클래스는 항상 object클래스 또는 다음에서 상속 된 다른 클래스에서 상속한다는 것입니다 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는 항상이어야합니다 object. 이는 Python의 모든 클래스의 루트입니다.

object기술적으로 파이썬에서 "새로운 스타일"클래스의 루트입니다. 그러나 오늘날의 새로운 스타일의 수업은 유일한 수업 스타일만큼 좋습니다.

그러나 object클래스를 만들 때이 단어를 명시 적으로 사용하지 않으면 다른 사람들이 언급했듯이 Python 3.x는 object수퍼 클래스 에서 암시 적으로 상속합니다 . 하지만 명시적인 것이 항상 암시적인 것보다 낫다고 생각해 (지옥)

참고

참고 URL : https://stackoverflow.com/questions/4015417/python-class-inherits-object

반응형