파이썬 학습 노트 18:클래스 II

파이썬 학습 노트 18:클래스 II


Python 학습노트9: 클래스에서 우리는 몇 가지 기초적인 클래스 정의와 사용 방식을 소개했다. 우리는 여기서 OOP의 원칙으로 이를 재검토하고 언급하지 않은 부분을 보충한다.

봉인


봉인에 관해서 앞에서 우리는 간단한 봉인 방식, 즉 접두사_ 또는__로 유사한 방문 수식자의 역할을 실현하는 방법을 소개했다.
그러나 우리가 어떻게 이런 방법을 실현하는지 설명하지 않은 것이 하나 있다.
우리는 클래스 방법과 대상 방법의 가장 큰 차이는 대상의 속성에 의존하지 않고 대상 지침이나 인용도 존재하지 않는다는 것을 안다.
class sampleCls:
    @classmethod
    def classMethod(cls):
        print(cls)
        print("this is a class method")

    def objMethod(self):
        print(self)
        print("this is a object method")

a = sampleCls()
a.objMethod()
sampleCls.classMethod()

출력
this is a object method main.sampleCls’> this is a class method
위에서 볼 수 있듯이 함수 수식자classmethod를 사용하여 우리는 클래스 방법classMethod을 정의했다.
최종 인쇄 결과에 따르면 이 두 방법이 가지고 있는 인용은 각각 대상과 클래스이다.

물려받다


파이톤은 계승에 있어서 전통적인 프로그래밍 언어와 크게 다르며 다중 계승을 지원한다.
좀 복잡한 예를 살펴보겠습니다.
class A:
    def __init__(self):
        print("A.__init__()")

class B(A):
    def __init__(self):
        super().__init__()
        print("B.__init__()")

class C(A):
    def __init__(self):
        super().__init__()
        print("C.__init__()")

class D(B,C):
    def __init__(self):
        super().__init__()
        print("D.__init__()")

d = D()
print(D.__mro__)

출력:
A.init() C.init() B.init() D.init() (main.D’>, main.B’>, main.C’>, main.A’>, )
출력에서 알 수 있듯이 이 계승 관계의 창설 과정은 A>C>B>D이다. 그 중에서 C와 B는 모두 A를 계승했지만 해석기는 매우 똑똑해서 A를 한 번만 창설했다.
우리는 구축 과정을 관찰하기 위해 구조 함수에서 출력하는 것 외에 D.__mro__를 통해 계승 관계 체인을 출력했다.
MRO에 대해 파이톤 쿡북이란 책은 이렇게 설명한다.
Python은 사용자가 정의한 모든 종류에 대해 이른바 방법 해석 순서 (MRO) 목록을 계산합니다.이 MRO 목록은 모든 기본 클래스의 선형 순서표입니다.
나는 간단한 분류도를 그려서 위의 계승 관계와 MRO 검색 순서를 설명했다.
[외부 체인 사진 저장 실패, 원본 사이트에 도난 방지 체인 메커니즘이 있을 수 있으므로 사진을 저장하여 직접 업로드하는 것을 권장합니다(img-Tj6DwTit-1616934528932)https://i.loli.net/2021/03/28/Ek6YPH23X5m7GWO.png)]
MRO 검색 순서에 대해 파이썬 쿡북은 이렇게 말했다.
  • 자류가 부류보다 먼저 검사를 받는다
  • 여러 부류는 목록에 있는 순서에 따라 검사된다
  • 다음 클래스에 대해 두 가지 합법적인 선택이 존재하면 첫 번째 부류를 선택
  • 우리의 이 예는 이미 매우 혼란스러워 보인다. 만약에 상속층이 더욱 복잡한 국면에 부딪히면 상속체인을 정리하는 어려움을 짐작할 수 있다.나의 건의는 clsName.__mro__를 사용하여 해석기의 실제 계승 체인을 보고 UML 그림과 결합하여 계승 관계를 정리하는 것이다.
    이렇게 하는 필요성에 대해 만약 당신의 계승 체인에 같은 이름의 함수가 서로 덮어씌워진다면, 계승 체인을 정리해야만 어느 것이 어느 것을 덮어씌울지 확실히 알 수 있다.

    다태


    다태적으로 말하자면 그 핵심 내용은 추상적인 종류와 인터페이스일 것이고 파이톤에서는 마찬가지다.
    from abc import ABCMeta, abstractmethod
    
    
    class Base(metaclass=ABCMeta):
        @abstractmethod
        def fly(self):
            ''' '''
            pass
    
    class SubBase(Base):
        def fly(self):
            print("I can fly")
    
    # base = Base()  , 
    base = SubBase()
    base.fly()
    
    abc 모듈을 빌려 우리는 추상적인 기류를 실현할 수 있다. 인터페이스는 이와 유사하다. 왜냐하면 파이톤은 다중 계승을 지원하기 때문이다.
    여기metaclass=ABCMeta는 원 프로그래밍의 범위에 속하기 때문에 우리는 토론을 많이 하지 않는다.
    파이썬 중류에 대한 더 많은 내용은 파이썬 쿠키북의 관련 장을 읽을 수 있다.

    좋은 웹페이지 즐겨찾기