모든 파이썬 클래스가 객체를 확장해야합니까?


129

나는 다음 두 가지 일을 모두 발견했다.

class Foo():
    def a(self):
        print "hello"

class Foo(object):
    def a(self):
        print "hello"

모든 파이썬 클래스가 객체를 확장해야합니까? 객체를 확장하지 않는 데 잠재적 인 문제가 있습니까?


2
class Foo():와 사이에 차이가 class Foo:있습니까? 내가 알다시피, 둘 다 파이썬 3에서 작동합니다.
Wolf

이 질문에 잘 답했습니다 : stackoverflow.com/questions/4015417/…
nngeek

답변:


117

파이썬 2에서 상속하지 않으면 object구식 클래스가 만들어지며 다른 스타일 중에서도 다른 type결과가 나타납니다.

>>> class Foo: pass
... 
>>> type(Foo())
<type 'instance'>

vs.

>>> class Bar(object): pass
... 
>>> type(Bar())
<class '__main__.Bar'>

또한 다중 상속 규칙 은 여기에서 요약하지도 않는 방식으로 다릅니다 . MI에 대해 본 모든 훌륭한 문서는 새로운 스타일의 클래스를 설명합니다.

마지막으로, 파이썬 3에서는 구식 클래스가 사라졌고 상속은 object암시 적으로되었습니다. 따라서 이전 소프트웨어와의 하위 호환성이 필요하지 않으면 항상 새로운 스타일 클래스를 선호하십시오.


68

파이썬 3에서 클래스는 object암묵적으로 확장 됩니다.

Python 2에는 구식 및 신식 클래스가 있습니다. 클래스가 새로운 스타일이라는 신호를 보내려면에서 명시 적으로 상속해야합니다 object. 그렇지 않은 경우 이전 스타일 구현이 사용됩니다.

당신은 일반적으로 새로운 스타일의 수업을 원합니다. object명시 적으로 상속합니다 . 이는 Python 2와 호환되는 Python 3 코드에도 적용됩니다.


예, Free Foo가 지적한 차이점 은 사라졌습니다. BTW : 빈 괄호는 선택 사항입니까?
울프

4
foo (object) :를 사용하는 많은 Python 3 코드가 있습니다. 이것은 단지 컨벤션입니까?
RFV5s

2
@RFVenter 파이썬 2와 3에서 실행되는 코드 일 수 있습니다.이 경우 파이썬 2에서 클래스가 거의 동일하게 동작하도록하기 위해 객체를 명시 적으로 서브 클래 싱해야합니다.
blubberdiblub

@blubberdiblub 그것은 프로젝트가 python 3.5 virtualenv에서만 독점적으로 실행되고 있다고 의심 한 것입니다. 파이썬 2 프로젝트에서 코드를 복사해야한다고 생각합니다.
RFV5s

@RFVenter yup, 또 다른 설명 일 수 있습니다. 물론 현재 Python 3.x라면 객체 참조를 제거하는 것이 좋습니다.
blubberdiblub

17

파이썬 3에서는 세 가지 다른 방법으로 클래스를 만들 수 있으며 내부적으로 모두 동일합니다 (예 참조). 클래스를 만드는 방법은 중요하지 않지만 Python 3의 모든 클래스는 object 라는 특수 클래스에서 상속됩니다 . 클래스 객체 는 파이썬의 기본 클래스이며 이중 밑줄 메소드, 설명자, super () 메소드, property () 메소드 등과 같은 많은 기능을 제공합니다.

예 1.

class MyClass:
 pass

예 2.

class MyClass():
 pass

실시 예 3.

class MyClass(object):
  pass

1
이것은 엄격하게 사실이 아닙니다 ... stackoverflow.com/questions/1238606/…
Philip Adler

나는 당신을 따라 확신하지 않습니다. 그렇습니다. 아마도 대부분의 사람들과 관련이있을 때까지는 관련이 없습니다.
Philip Adler

@PhilipAdler 일반적으로 object내장을 참조 한다고 가정합니다 object. CPython의 내장 식별자를 대체 할 수 있다는 점을 고려해야한다면 데이터 모델에 대한 주장은 거의 할 수 없습니다. str문자열을 할당 할 수 있기 때문에 항상 문자열을 인수로 허용하지는 않는다고 주장 할 수 builtins.str = None있습니까?
Nuno André

나는 이것이 "광범위하게 가정된다"는 주장을 계속보고 있으며, 현재의 모든 구현이 언어의 요구 사항이 아니라고 가정한다는 것을 인정합니다. 그것은 대부분의 파이썬 프로그래머가 이것을 만났거나 그것에 대해 알고 있거나 심지어 고려해 보았습니다. 어쨌든, 그것이 사실이더라도 일반적으로 가정되는 주장은 동등성이 엄격 하지 않다는 나의 주장을 무효화하지 않는다 .
Philip Adler

1

예, 모든 Python 클래스는 객체를 확장해야합니다 (또는 서브 클래스, 여기서는 Python입니다). 일반적으로 심각한 문제는 발생하지 않지만 여러 상속 트리와 마찬가지로 일부 경우에는 이것이 중요합니다. 또한 Python 3과의 호환성이 향상됩니다.


1
정확히, 당신이 기술적으로 경우에 당신은 고전적인 클래스를 얻을 것이다,하지만 거기에 이것에 진짜 장점은없고, 그것이 어쨌든 파이썬 3를 지원하지 않습니다
최대 K.

python3과의 호환성을 향상시키는 이유가 궁금합니다. 내 이해에 따르면, python3은 객체를 지정하지 않아도 자동으로 객체를 확장시킵니다.
Paul Lo

2
@PaulLo 맞습니다.하지만 객체에서 명시 적으로 상속하면 Python 2와 Python 3에서 동일한 (새로운 스타일) 동작을 얻게됩니다. Python 3의 작동 방식을 변경하는 것이 아니라 앞으로 사용하는 것이 중요합니다.
pydsigner

이 제안은 매우 우아하지는 않지만 Python2 및 Python3을 해결하는 경우 효과적입니다. 그러나 실제로 얼마나 관련이 있습니까?
울프

@ 울프 그것은 당신이하고있는 일에 달려 있습니다. 복잡한 상속 트리가 있다면 상당히 중요합니다. 클래스를 설명자가 되려면 새 스타일을 사용해야합니다. 더 자세한 정보를 원하면 stackoverflow.com/questions/54867/… 의 링크를 따라갈 수 있습니다 .
pydsigner

1

다른 답변에서 다루었 듯이 Python 3의 객체 상속은 암시 적입니다. 그러나 그들은 당신이해야 할 일과 협약이 무엇인지 말하지 않습니다.

파이썬 3 문서 예제는 모두 다음과 같은 규칙 스타일을 사용합니다. 따라서 파이썬 3의 향후 코드 에서이 스타일을 따르는 것이 좋습니다.

class Foo:
    pass

출처 : https://docs.python.org/3/tutorial/classes.html#class-objects

인용문 예 :

클래스 객체는 속성 참조와 인스턴스화라는 두 가지 종류의 작업을 지원합니다.

속성 참조는 Python의 모든 속성 참조에 사용되는 표준 구문 인 obj.name을 사용합니다. 유효한 속성 이름은 클래스 객체를 만들 때 클래스의 네임 스페이스에 있던 모든 이름입니다. 따라서 클래스 정의가 다음과 같은 경우

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

다른 인용문 :

일반적으로 인스턴스 변수는 각 인스턴스에 고유 한 데이터를위한 것이고 클래스 변수는 클래스의 모든 인스턴스가 공유하는 속성 및 메서드를위한 것입니다.

class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

0

python3에서는 차이가 없지만 python2에서는 확장하지 않으면 object구식 클래스가 제공됩니다. 이전 스타일 클래스보다 새로운 스타일 클래스를 사용하고 싶습니다.


2
이 답변은 합리적이지만 다른 답변자들은 더 빠르거나 세부적인 정보를 얻었습니다. 이 답변은 페이지의 가치를 그대로 유지합니다.
Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.