나는 다음 두 가지 일을 모두 발견했다.
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
모든 파이썬 클래스가 객체를 확장해야합니까? 객체를 확장하지 않는 데 잠재적 인 문제가 있습니까?
나는 다음 두 가지 일을 모두 발견했다.
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
모든 파이썬 클래스가 객체를 확장해야합니까? 객체를 확장하지 않는 데 잠재적 인 문제가 있습니까?
답변:
파이썬 2에서 상속하지 않으면 object
구식 클래스가 만들어지며 다른 스타일 중에서도 다른 type
결과가 나타납니다.
>>> class Foo: pass
...
>>> type(Foo())
<type 'instance'>
vs.
>>> class Bar(object): pass
...
>>> type(Bar())
<class '__main__.Bar'>
또한 다중 상속 규칙 은 여기에서 요약하지도 않는 방식으로 다릅니다 . MI에 대해 본 모든 훌륭한 문서는 새로운 스타일의 클래스를 설명합니다.
마지막으로, 파이썬 3에서는 구식 클래스가 사라졌고 상속은 object
암시 적으로되었습니다. 따라서 이전 소프트웨어와의 하위 호환성이 필요하지 않으면 항상 새로운 스타일 클래스를 선호하십시오.
파이썬 3에서 클래스는 object
암묵적으로 확장 됩니다.
Python 2에는 구식 및 신식 클래스가 있습니다. 클래스가 새로운 스타일이라는 신호를 보내려면에서 명시 적으로 상속해야합니다 object
. 그렇지 않은 경우 이전 스타일 구현이 사용됩니다.
당신은 일반적으로 새로운 스타일의 수업을 원합니다. object
명시 적으로 상속합니다 . 이는 Python 2와 호환되는 Python 3 코드에도 적용됩니다.
파이썬 3에서는 세 가지 다른 방법으로 클래스를 만들 수 있으며 내부적으로 모두 동일합니다 (예 참조). 클래스를 만드는 방법은 중요하지 않지만 Python 3의 모든 클래스는 object 라는 특수 클래스에서 상속됩니다 . 클래스 객체 는 파이썬의 기본 클래스이며 이중 밑줄 메소드, 설명자, super () 메소드, property () 메소드 등과 같은 많은 기능을 제공합니다.
예 1.
class MyClass:
pass
예 2.
class MyClass():
pass
실시 예 3.
class MyClass(object):
pass
object
내장을 참조 한다고 가정합니다 object
. CPython의 내장 식별자를 대체 할 수 있다는 점을 고려해야한다면 데이터 모델에 대한 주장은 거의 할 수 없습니다. str
문자열을 할당 할 수 있기 때문에 항상 문자열을 인수로 허용하지는 않는다고 주장 할 수 builtins.str = None
있습니까?
예, 모든 Python 클래스는 객체를 확장해야합니다 (또는 서브 클래스, 여기서는 Python입니다). 일반적으로 심각한 문제는 발생하지 않지만 여러 상속 트리와 마찬가지로 일부 경우에는 이것이 중요합니다. 또한 Python 3과의 호환성이 향상됩니다.
다른 답변에서 다루었 듯이 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
python3에서는 차이가 없지만 python2에서는 확장하지 않으면 object
구식 클래스가 제공됩니다. 이전 스타일 클래스보다 새로운 스타일 클래스를 사용하고 싶습니다.
class Foo():
와 사이에 차이가class Foo:
있습니까? 내가 알다시피, 둘 다 파이썬 3에서 작동합니다.