파이썬 클래스는 객체를 상속받습니다.


1241

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

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

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


115
이 질문에 대한 답은 간단하지만 찾기가 어렵습니다. "파이썬 객체 기본 클래스"와 같은 인터넷 검색은 객체 지향 프로그래밍에 대한 튜토리얼 페이지와 페이지를 제공합니다. 이 검색어를 알려준 첫 번째 링크이기 때문에 Upvoting "이전 대 새로운 스타일의 파이썬은 객체"
vastlysuperiorman

답변:


763

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

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


파이썬 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잊어 버리십시오. "새로운"스타일 클래스의 다른 특성과 함께 이전 글 머리 기호에 대한 자세한 설명은 여기를 참조하십시오 .

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


파이썬 3.x 이야기 :

파이썬 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 파이썬과 무관하게 시도하는 코드를 작성 하는 경우, 즉 파이썬 2와 파이썬 3 모두에서 작동해야합니다. 무대 뒤에서.


=> 사실은 "기본 클래스와 같은 내장 타입의 부재 또는 존재"에 대한하지만, 클래스 상속 어떠했는지 아니다 "기본 수준으로 내장 타입의 유무에 따라"- 직접 또는 간접적으로 -에서 object. IIRC는 아직 모든 내장 유형이 새로운 스타일의 클래스로 포팅되는 것은 아닙니다.
bruno desthuilliers

@brunodesthuilliers 필자의 인상은 모든 내장 유형이에서 상속받은 것 object입니다. 나는 파이썬 2.2.3을 가지고 있으며 빠른 점검 후에 가해자를 찾을 수는 없지만 나중에 더 명확하게하기 위해 대답을 바꿔 쓸 것입니다. 그래도 예를 찾을 수 있다면 흥미로울 것입니다. 제 호기심은 자극적입니다.
Dimitris Fasarakis Hilliard

모든 정직에서 (이전 의견에서 "IIRC"참조) 나는이 점에 대해 101 % 확신하지 못합니다 (모든 내장 유형이 새로운 스타일 클래스가 도입되었을 때 이미 새로운 스타일 클래스로 변환 되었음)-나는 평범 할 수 있습니다 잘못되었거나 표준 lib 유형 (내장되지는 않음) 중 일부에만 관련되었을 수 있습니다. 그러나 나는 새로운 스타일의 수업을 만드는 것이 기초에 있다는 것을 분명히하는 것이 더 낫다고 생각합니다 object.
bruno desthuilliers 11

7
너무 나쁜 stackoverflow는 이러한 일종의 답변에 대해서만 upvote = upvote + 1을 수행합니다. upvote + = N을 수행 할 수 있기를 바랍니다.
PirateApp

1
staticmethod그리고 classmethod잘 심지어 이전 스타일의 클래스에 작동합니다. propertysorta는 이전 스타일 클래스에서 읽기 작업을 수행하며 쓰기를 가로 채지 못합니다 (따라서 이름을 지정하면 인스턴스가 지정된 이름의 속성을 가져 와서 속성을 가리게됩니다). 또한 __slots__속성 액세스 속도의 향상은 대부분 새로운 스타일 클래스 속성 액세스로 인한 손실을 취소하는 것이므로 실제로 새로운 스타일 클래스의 판매 지점이 아닙니다 (메모리 절약은 판매 지점입니다).
ShadowRanger

540

파이썬 3

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

파이썬 2

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

설명 :

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

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

문제는 Python 2.x의 구식 클래스에 대한 구문이 Python 3.x의 새 스타일 클래스에 대한 대체 구문과 동일하다는 것 입니다. Python 2.x는 여전히 널리 사용되며 (예 : GAE, Web2Py) 3.x 스타일 클래스 정의를 무심코 2.x 코드로 가져 오는 코드 (또는 코더)는 심각하게 오래된 기본 개체로 끝납니다. 그리고 구식 수업은 다른 사람의 레이더에 없기 때문에 어떤 수업에 부딪 쳤는지 모를 것입니다.

따라서 먼 길을 철수하고 2.x 개발자에게 눈물을 저장하십시오.


13
"Python 3.x에서 기본 클래스를 정의 할 때 정의에서 객체를 제거 할 수 있습니다. 그러나 이로 인해 문제를 추적하기가 매우 어려워 질 수 있습니다 ..."어떤 문제가 있습니까?
Aidis

6
@ Aidis : Py2와 Py3 모두에서 실행되는 코드는 Py3에서 괜찮을 것이지만 새로운 스타일의 클래스 기능에 의존하면 Py2에서 손상된다는 것을 의미합니다. 개인적으로, 그런 코드를 작성하는 경우 명시 적 상속을 생략 __metaclass__ = type하고 모듈 맨 위에 ( from __future__ import absolute_import, division, print_function-: 행 뒤에) 넣 습니다 . Py2의 호환성 해킹으로 기본적으로 모듈의 모든 정의 된 클래스를 기본적으로 새 스타일로 만들고 Py3에서는 완전히 무시됩니다 (임의의 전역 변수가 그대로 있음). 무해합니다.
ShadowRanger

400

예, 이것은 '새로운 스타일'객체입니다. 그것은 python2.2에서 소개 된 기능이었습니다.

새로운 스타일의 객체는 고전적인 객체에 대한 서로 다른 개체 모델을 가지고 있고, 몇 가지 예를 위해, 이전 스타일 객체와 제대로 작동하지 않습니다 super(), @property및 설명. 새로운 스타일 클래스에 대한 자세한 설명은 이 기사 를 참조하십시오 .

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


110
+1이. 구식 클래스는 Python 3에서 사라 object

9
이것은 실제 답변이 아닙니다. 나는 단지 다른 기사를 참조합니다. 야린의 대답이이 질문에 대한 대답으로 받아 들여 져야한다고 생각합니다.
alwbtc

2
@alwbtc :이 답변에도 새로운 것이 있습니다. 예를 들어, "super ()"에 대한 언급은 또 다른 중요한 것으로 여기게했습니다 ( stackoverflow.com/questions/576169/… ).
ViFI

34

Learn Python the Hard Way의 역사 :

파이썬의 원래 클래스 변환은 여러 가지 심각한 방식으로 깨졌습니다. 이 결함이 인식되자 이미 너무 늦어서 지원해야했습니다. 이 문제를 해결하기 위해 "이전 클래스"가 계속 작동하지만 더 정확한 새 버전을 사용할 수 있도록 "새 클래스"스타일이 필요했습니다.

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

또한 새 스타일 클래스와 이전 스타일 클래스의 차이점이 무엇인지 알려면 새 스타일 클래스는 항상 object클래스 또는 다음에서 상속 된 다른 클래스에서 상속됩니다 object.

class NewStyle(object):
    pass

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

class AnotherExampleOfNewStyle(NewStyle):
    pass

구식 기본 클래스는 다음과 같습니다.

class OldStyle():
    pass

그리고 구식 자식 클래스는 다음과 같습니다.

class OldStyleSubclass(OldStyle):
    pass

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


8
루트 클래스를 호출하는 object것이 그다지 혼란 스럽지는 않지만 실제로는 표준입니다. 스몰 토크는이라는 루트 클래스 Object와라는 루트 메타 클래스를 가지고 Class있습니다. 왜? , 그냥 있기 때문에 Dog개를위한 클래스, Object객체에 대한 클래스이며, Class클래스에 대한 클래스입니다. Java, C #, ObjC, Ruby 및 오늘날 사람들이 루트 클래스를 사용하는 대부분의 다른 클래스 기반 OO 언어는 ObjectPython뿐만 아니라 이름으로 변형 된 이름을 사용 합니다.
abarnert

30

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

type()구식 객체 를 사용 하는 경우 "인스턴스"만 얻을 수 있습니다. 새로운 스타일의 객체에서 클래스를 얻습니다.


또한 type()구식 클래스에서 사용하는 경우 "type"대신 "classobj"가 표시됩니다.
Joel Sjögren

7

클래스 생성 문장의 구문 :

class <ClassName>(superclass):
    #code follows

특별히 상속하고자하는 다른 수퍼 클래스가 없다면 , 파이썬의 모든 클래스의 근본이 superclass되어야한다 object.

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

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

참고

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.