etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2022. 3. 17. 08:08
반응형

질문자 :tjvr


object 에서 상속되는 이유가 있습니까?

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

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


object 에서 상속되는 이유가 있습니까?

Python 3에서는 Python 2와 3 간의 호환성을 제외하고는 이유가 없습니다 . Python 2에서는 많은 이유가 있습니다.


파이썬 2.x 이야기:

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(메소드 확인 순서) : 호출할 메서드를 확인하려고 할 때 클래스의 기본 클래스가 검색되는 순서입니다.

  • MRO 관련 super . 또한 super() 는 슈퍼로 간주됩니다.

object 에서 상속하지 않는다면 이것들을 잊어버리세요. "새로운" 스타일 클래스의 다른 특전과 함께 이전 글머리 기호에 대한 자세한 설명은 여기 에서 찾을 수 있습니다.

새로운 스타일 클래스의 단점 중 하나는 클래스 자체가 더 많은 메모리를 요구한다는 것입니다. 그러나 많은 클래스 개체를 생성하지 않는 한 이것이 문제가 될 것인지 의심스럽고 긍정적인 바다에 부정적인 가라앉는 것입니다.


파이썬 3.x 이야기:

Python 3에서는 상황이 단순화되었습니다. 새로운 스타일의 클래스만 존재하므로(일반적으로 클래스라고 함) object 를 추가할 때의 유일한 차이점은 8자를 더 입력해야 한다는 것입니다. 이것:

 class ClassicSpam: pass

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

 class NewSpam(object): pass

그리고 이것에:

 class Spam(): pass

모두 __bases__ object 가 있습니다.

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

그럼 어떻게 해야 할까요?

Python 2: 항상 object 명시적으로 상속합니다. 혜택을 받으세요.

Python 3에서: object 에서 상속하십시오. 즉, Python 2와 Python 3에서 모두 작동해야 합니다. 그렇지 않으면 Python이 다음을 위해 삽입하기 때문에 실제로 차이가 없습니다. 당신은 무대 뒤에서.


Dimitris Fasarakis Hilliard

파이썬 3

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

파이썬 2

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

설명 :

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 개발자의 눈물을 절약하십시오.


Yarin

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

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

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


Jerub

어려운 방법으로 파이썬 배우기의 역사:

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에 도입되었습니다.


disp_name

네, 역사적 입니다. 그것 없이는 구식 클래스를 만듭니다.

type() 을 사용하면 "인스턴스"만 얻습니다. 새로운 스타일의 객체에서 클래스를 얻습니다.


knitti

클래스 생성 문의 구문:

 class <ClassName>(superclass): #code follows

특별히 상속받고 싶은 다른 슈퍼클래스가 없는 경우 superclass 는 항상 object 여야 합니다. 이는 Python의 모든 클래스의 루트입니다.

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

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

참조


kmario23

출처 : http:www.stackoverflow.com/questions/4015417/why-do-python-classes-inherit-object

반응형