티스토리 뷰
"파이썬 클래스 1 - 파이썬 배우기(Python)"에 이은 포스팅 입니다.
■ 상속(Inheritance)
상속은 클래스 핵심 개념중 하나로 슈퍼 클래스를 두고 슈퍼 클래스의 모든 속성을 상속 받으면서 전문적인 부가정보를 갖는 서브 클래스를 정의하는 방식 입니다.
한개 이상의 슈퍼 클래스로부터 상속을 받을 수 있고, 시스템 내장 클래스도 상속 받아 기능을 확장할 수 있습니다.
생성자(__init__)는 서브 클래스 부터 슈퍼 클래스로 계층적으로 이동하면서 한번만 호출 됩니다.
즉 서브 클래스에 __init__가 정의되어 있으면 서브 클래스의 생성자만 호출되고 서브 클래스에 없고 슈퍼 클래스에 있으면 슈퍼 클래스 생성자가 호출 됩니다. 따라서, 서브 및 슈퍼 클래스에 모두 생성자가 있는 경우에는 서브 클래스 __init__에서 슈퍼 클래스의 생성자를 명시적으로 호출해 주어야 합니다.
"슈퍼클래스명.__init__(self)"의 형식 입니다.서브 클래스에 슈퍼클래스의 메쏘드와 동일한 이름의 메쏘드를 정의하면(Override) 참조 우선순위는 서브 클래스에 있기 때문에 메쏘드를 대치하는 효과를 낼 수 있습니다. 슈퍼 클래스의 메쏘드가 동일 클래스내의 다른 메쏘드를 호출할 때 서브 클래스에서 해당 메쏘드를 Override했다면 슈퍼 클래스의 메쏘드 대신 서브 클래스의 메쏘드가 호출 됩니다.
파이썬의 기본 타입들은 대부분 클래스 이름 입니다.
isinstance(오브젝트, 타입또는클래스)
오브젝트가 지정한 타입 또는 클래스의 인스턴스면 True 리턴issubclass(클래스, 베이스클래스)
클래스가 베이스클래스의 서브 클래스면 True 리턴__mro__
클래스 상속이 복잡한 경우 참조 순서도 복잡해 질 수 있는데 파이썬에서는 슈퍼 클래스에서 object를 상속받은 경우 각 클래스 마다 __mro__속성에 메쏘드 처리순서(MRO, Method Resolution Order) 정보를 기록하고 클래스명.mro()로 조회할 수 있습니다.super(클래스, self).메쏘드()
MRO순서 상의 슈퍼클래스에 속하는 메쏘드를 호출 합니다.__bases__
상속 받은 모든 슈퍼 클래스를 튜플로 리턴min(클래스배열, key=메쏘드)
key값을 리턴하는 메쏘드를 통해서 클래스 배열에 대한 min()을 구할 수 있게 한다. max()도 마찬가지 형태로 사용할 수 있습니다. 물론 사용하려면 클래스 내에 해당 메쏘드가 정의되어 있어야 합니다.클래스가 object를 상속받은 경우에는 클래스명 자체를 타입으로 사용 할 수 있습니다.
■ 서술자(Descriptor)
클래스 내에서 특정 오브젝트의 값을 참조, 설정, 삭제 처리를 처리해 주는 클래스 입니다. 상위 클래스의 속성 정의 형태로 서술자를 기술하고 각 서술자 클래스는 미리 정의된 아래와 같은 메쏘드를 정의해야 합니다.
__get__(self, 인스턴스, 소유자)
서술자 오브젝트를 참조할 때 호출 됩니다.__set__(self, 인스턴스, 값)
서술자 오브젝트에 값을 설정할 때 호출 됩니다.__delete__(self, 인스턴스)
서술자 오브젝트가 삭제 될때 호출 됩니다.
property 객체로 속성을 정의 하는 것과 유사하게 동작한다고 할 수 있습니다. 아래는 화씨와 섭씨를 동시에 가지고 있는 클래스를 표현한 것 입니다.
class Celsius( object ): def __init__( self, value=0.0 ): self.value= float(value) def __get__( self, instance, owner ): return self.value def __set__( self, instance, value ): self.value= float(value) class Farenheit( object ): def __get__( self, instance, owner ): return instance.celsius * 9 / 5 + 32 def __set__( self, instance, value ): instance.celsius= (float(value)-32) * 5 / 9 class Temperature( object ): celsius= Celsius() farenheit= Farenheit()
■ with 문
시작, 처리, 종료의 과정을 밟는 파일 처리, 데이터베이스 처리, 네트워크 처리 등을 다루는 클래스를 위해서 파이썬은 with 문을 제공하고 있습니다. 문법은 아래와 같습니다.
with 클래스 생성자 as 오브젝트:
코드블럭
파일 처리를 예로 든다면
f = file('test.txt','r')
for line in f:
print line
f.close()
위의 파이썬 코드는 with 문으로 전환하면 아래와 같습니다.
with file('test.txt','r') as f:
for line in f:
print line
with문은 시작 시점에 해당 클래스의 __enter__(self) 메쏘드를 호출해주고, with문 끝에 __exit__(type, value, traceback) 메쏘드를 호출해 주므로 내장 라이브러리에 대한 처리가 아니라도 클래스 정의에 해당 시점에 대한 적절한 코드를 포함시키면 with문에 따른 효과적인 처리가 가능해 질 수 있습니다.
'프로그래밍' 카테고리의 다른 글
유용한 파이썬 라이브러리 모듈 - 파이썬 배우기(Python) (0) | 2019.03.22 |
---|---|
파이썬 모듈과 패키지 - 파이썬 배우기(Python) (0) | 2019.03.22 |
파이썬 클래스 1 - 파이썬 배우기(Python) (0) | 2019.03.21 |
파이썬 함수 - 파이썬 배우기(Python) (0) | 2019.03.20 |
파이썬 제어구조 2 - 파이썬 배우기(Python) (0) | 2019.03.20 |