티스토리 뷰

728x90

"파이썬 클래스 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문에 따른 효과적인 처리가 가능해 질 수 있습니다.




728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함