programing

Python의 오래된 스타일과 새로운 스타일의 클래스는 무엇이 다릅니까?

projobs 2022. 10. 31. 23:13
반응형

Python의 오래된 스타일과 새로운 스타일의 클래스는 무엇이 다릅니까?

Python의 오래된 스타일과 새로운 스타일의 클래스는 무엇이 다릅니까?언제 둘 중 하나를 사용해야 하나요?

New-styleClassic 클래스:

Python 2.1까지는 구식 클래스가 사용자가 사용할 수 있는 유일한 맛이었습니다.

스타일의)합니다. if (오래된 스타일의) 클래스인 경우입니다.x이며, 그 다음은 구식 클래스입니다.x.__class__는 의 클래스를 나타냅니다.xtype(x) 있다<type 'instance'>

이는 클래스와는 무관하게 모든 오래된 스타일의 인스턴스가 인스턴스라고 불리는 단일 빌트인 타입으로 구현된다는 사실을 반영합니다.

새로운 스타일의 클래스는 클래스와 유형의 개념을 통합하기 위해 Python 2.2에 도입되었습니다.새로운 스타일의 클래스는 단순히 사용자 정의 유형일 뿐이며, 그 이상도 이하도 아닙니다.

클래스의 x는 스타일의 클래스입니다.type(x)일반적으로 와 동일하다x.__class__(되지 않지만 는 에 대해 된 값(「」 「」 「」)을 덮어쓸 수 있습니다x.__class__를 참조해 주세요.

새로운 스타일의 클래스를 도입하는 주된 동기는 완전한 메타 모델을 갖춘 통합 객체 모델을 제공하는 것입니다.

또한 대부분의 기본 제공 유형을 하위 분류할 수 있는 기능이나 계산된 속성을 사용할 수 있는 "설명자"의 도입 등 많은 즉각적인 이점이 있습니다.

호환성을 위해 클래스는 기본적으로 여전히 오래된 스타일입니다.

새 유형 클래스는 다른 새 유형 클래스(예: 유형)를 부모 클래스로 지정하거나 다른 부모가 필요하지 않은 경우 "최상위 유형" 개체를 지정하여 만들어집니다.

새로운 스타일의 클래스 동작은 반환되는 유형뿐만 아니라 많은 중요한 세부 사항에서 오래된 스타일의 클래스 동작과 다릅니다.

이러한 변경 중 일부는 특별한 메서드가 호출되는 방식과 같이 새로운 오브젝트 모델의 기본입니다.그 외의 「수정」은, 복수의 상속의 경우의 방법 해결 순서 등, 호환성에 관한 문제로 이전에는 실장할 수 없었던 것입니다.수정」입니다.

Python 3에는 새로운 스타일의 클래스만 있습니다.

object파이썬 3의 약칭.

선언 방식:

새 형식 클래스는 개체 또는 다른 새 형식 클래스에서 상속됩니다.

class NewStyleClass(object):
    pass

class AnotherNewStyleClass(NewStyleClass):
    pass

구식 수업은 그렇지 않다.

class OldStyleClass():
    pass

Python 3 주의:

Python 3은 오래된 스타일의 클래스를 지원하지 않기 때문에 위에서 언급한 어느 폼이든 새로운 스타일의 클래스가 됩니다.

구식 클래스와 신식 클래스 간의 중요한 동작 변화

MRO(Method Resolution Order) 변경

다른 답변에서도 언급되었지만, 클래식 MRO와 C3 MRO(새로운 스타일의 클래스에서 사용됨)의 차이점에 대한 구체적인 예를 소개합니다.

문제는 여러 상속에서 속성(메서드와 멤버 변수 포함)이 검색되는 순서입니다.

클래식 클래스는 왼쪽에서 오른쪽으로 깊이 우선 검색을 수행합니다.첫 번째 시합에서 멈추세요.그들은 다음 정보를 가지고 있지 않다.__mro__여하하다

class C: i = 0
class C1(C): pass
class C2(C): i = 2
class C12(C1, C2): pass
class C21(C2, C1): pass

assert C12().i == 0
assert C21().i == 2

try:
    C12.__mro__
except AttributeError:
    pass
else:
    assert False

새로운 스타일의 MRO는 하나의 영어 문장으로 합성하는 것이 더 복잡하다.여기에 자세히 설명되어 있습니다.속성 중 하나는 기본 클래스가 파생된 모든 클래스가 검색된 후에만 검색된다는 것입니다.그들은 가지고 있다__mro__검색 순서를 표시하는 속성입니다.

class C(object): i = 0
class C1(C): pass
class C2(C): i = 2
class C12(C1, C2): pass
class C21(C2, C1): pass

assert C12().i == 2
assert C21().i == 2

assert C12.__mro__ == (C12, C1, C2, C, object)
assert C21.__mro__ == (C21, C2, C1, C, object)

는 음음음음음 new new new new new new new new new new에서 한 수 .Exception

Python 2.5 주변에서는 많은 클래스를 올릴 수 있었고 Python 2.6 주변에서는 제거되었습니다.Python 2.7.3의 경우:

# OK, old:
class Old: pass
try:
    raise Old()
except Old:
    pass
else:
    assert False

# TypeError, new not derived from `Exception`.
class New(object): pass
try:
    raise New()
except TypeError:
    pass
else:
    assert False

# OK, derived from `Exception`.
class New(Exception): pass
try:
    raise New()
except New:
    pass
else:
    assert False

# `'str'` is a new style object, so you can't raise it:
try:
    raise 'str'
except TypeError:
    pass
else:
    assert False

이전 스타일 클래스는 여전히 속성 검색에 약간 더 빠릅니다.이는 보통 중요하지 않지만 성능에 민감한 Python 2.x 코드에서 유용할 수 있습니다.

[3]: 클래스 A:...: def __init__(self):
...: self.a = '안녕하세요'...:
[4]에서: 클래스 B(객체):
...: def __init__(self):
...: self.a = '안녕하세요'...:
입력 [6]: aobj = A()입력 [7]: bobj = B()
입력 [8]: %timeit aobj.a10000000 루프, 베스트 오브 3: 루프당 78.7 ns
입력 [10]: %timeit bobj.a10000000 루프, 베스트 오브 3: 86.9 ns/루프

Guido는 The Inside Story on New-Style Classes를 작성했습니다.이것은 Python의 새로운 스타일과 오래된 스타일의 클래스에 관한 매우 훌륭한 기사입니다.

Python 3 python python python 에 python python python python python python python python python 。을 쓰더라도 ' 수업'은으로 '구식 수업'에서 입니다.object.

는 오래된 클래스가 된 고급 . 예를 , 오래된 의 클래스는 그렇지 않습니다.super, 새로운 C3 mro, 몇 가지 마법의 방법 등.

여기 매우 실용적인, 참과 거짓의 차이가 있습니다.다음 코드의 두 버전 간의 유일한 차이점은 두 번째 버전에서는 사용자가 개체에서 상속한다는 것입니다.그 외에는 두 버전은 동일하지만 결과는 다릅니다.

  1. 구식 수업

    class Person():
        _names_cache = {}
        def __init__(self,name):
            self.name = name
        def __new__(cls,name):
            return cls._names_cache.setdefault(name,object.__new__(cls,name))
    
    ahmed1 = Person("Ahmed")
    ahmed2 = Person("Ahmed")
    print ahmed1 is ahmed2
    print ahmed1
    print ahmed2
    
    
    >>> False
    <__main__.Person instance at 0xb74acf8c>
    <__main__.Person instance at 0xb74ac6cc>
    >>>
    
    
  2. 새로운 스타일의 클래스

    class Person(object):
        _names_cache = {}
        def __init__(self,name):
            self.name = name
        def __new__(cls,name):
            return cls._names_cache.setdefault(name,object.__new__(cls,name))
    
    ahmed1 = Person("Ahmed")
    ahmed2 = Person("Ahmed")
    print ahmed2 is ahmed1
    print ahmed1
    print ahmed2
    
    >>> True
    <__main__.Person object at 0xb74ac66c>
    <__main__.Person object at 0xb74ac66c>
    >>>
    

새로운 형식의 클래스는 다음에서 상속됩니다.objectPython 2.2 이후 버전(예: Python 2.2 이상)에 기재되어 있어야 합니다.class Classname(object):대신class Classname:)의 핵심 변경은 유형과 클래스를 통합하는 것입니다.또한 이 변경의 좋은 단점은 빌트인 타입에서 상속할 수 있다는 것입니다.

상세한 것에 대하여는, 설명 인쇄를 참조해 주세요.

새로운 스타일의 클래스에서 사용할 수 있습니다.super(Foo, self)어디에Foo클래스이고self는 인스턴스입니다.

super(type[, object-or-type])

메서드 호출을 상위 또는 형제 유형 클래스에 위임하는 프록시 개체를 반환합니다.이는 클래스에서 재정의된 상속된 메서드에 액세스하는 데 유용합니다.검색 순서는 getattr()에서 사용하는 순서와 동일하지만 유형 자체는 건너뜁니다.

그리고 Python 3.x에서는 간단하게super()매개 변수 없이 클래스 내에서 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/54867/what-is-the-difference-between-old-style-and-new-style-classes-in-python

반응형