Python 3.x의 Python 객체에서 상속하는 것이 필요하거나 유용합니까?


94

이전 파이썬 버전에서는 파이썬에서 클래스를 만들 때 객체 에서 상속 할 수 있습니다. 내가 이해하는 한 객체를 새로운 스타일 객체로 허용하는 특수 내장 파이썬 요소를 이해합니다.

최신 버전 (> 3.0 및 2.6)은 어떻습니까? 나는 클래스 객체에 대해 검색했지만 너무 많은 결과를 얻었습니다 (분명한 이유로). 힌트가 있습니까?

감사!


2
코드가 2.x에서도 사용되는 경우 명시 적으로 작성하는 것이 좋습니다.
smci

1
이 질문에 잘 답변되어 있습니다 : stackoverflow.com/questions/4015417/…
nngeek

답변:


93

object파이썬 3에서 새로운 스타일 을 얻기 위해에서 상속 할 필요가 없습니다. 모든 클래스는 새로운 스타일입니다.


5
이는 Python 3.1에서 object명시 적 입력 여부에 관계없이 모든 클래스가 상속됨을 의미합니다.(object)
u0b34a0f6ae dec

8
그럴 필요는 없지만 "Python 코드를 Python 3으로 이식"은 여전히 ​​유효하다고 말합니다. docs.python.org/py3k/howto/pyporting.html#subclass-object 또한 : docs.python.org/reference/ …
hyperboreean

에서 이 게시물 nngeek의 코멘트에 언급, (Py2 만 정말 관련) 새로운 스타일의 대 이전 스타일에 대한 좋은 안정 참조처럼 보인다입니다 : docs.python.org/2/reference/... - 위의 링크가있는 듯 변경 이후.
Eric Cousineau

80

나는 이것이 오래된 질문이라는 것을 알고 있지만 파이썬 3 에서도이 두 가지가 완전히 같지 않다는 점에 주목할 가치가 있습니다.

에서 명시 적으로 상속하는 경우 object실제로 수행하는 작업은 해당 시점이 가리키는 내용에 관계없이 에서 상속 builtins.object 하는 것입니다.

따라서 어떤 이유로 객체를 재정의하는 (매우 이상한) 모듈을 가질 수 있습니다. 이 첫 번째 모듈을 "newobj.py"라고 부를 것입니다.

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

그런 다음 다른 파일 ( "klasses.py")에서 :

class Greeter(object):
    pass

class NonGreeter:
    pass

그런 다음 세 번째 파일 (실제로 실행할 수 있음) :

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

따라서 객체에서 명시 적으로 상속하는 경우 암시 적 상속을 허용하는 것과 다른 동작이 발생 함을 알 수 있습니다.


13
일반적으로 행동이 동등하다는 기대가 있기 때문에 관련이 있습니다. 동등하지 않으므로 내 관찰.
Philip Adler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.