Python 객체 지향 프로그래밍: 상속, 속성, 및 컨텍스트 관리기

1. 다중 상속 및 MRO 순서

1.1 부모 클래스의 메서드 호출

다중 상속에서 부모 클래스의 메서드를 호출할 때는 각 상속받은 부모 클래스의 메서드를 모두 호출해야 합니다.

class 부모(object):
    def __init__(self, 이름):
        print('부모의 __init__ 호출')
        self.이름 = 이름
        print('부모의 __init__ 끝')

class 아들1(부모):
    def __init__(self, 이름, 나이):
        print('아들1의 __init__ 호출')
        self.나이 = 나이
        부모.__init__(self, 이름)
        print('아들1의 __init__ 끝')

class 아들2(부모):
    def __init__(self, 이름, 성별):
        print('아들2의 __init__ 호출')
        self.성별 = 성별
        부모.__init__(self, 이름)
        print('아들2의 __init__ 끝')

class 손자(아들1, 아들2):
    def __init__(self, 이름, 나이, 성별):
        print('손자의 __init__ 호출')
        아들1.__init__(self, 이름, 나이)
        아들2.__init__(self, 이름, 성별)
        print('손자의 __init__ 끝')

s = 손자('홍길동', 20, '남성')
print('이름:', s.이름)
print('나이:', s.나이)
print('성별:', s.성별)

1.2 다중 상속에서 super()의 사용

super()를 사용하면 부모 클래스의 메서드를 자동으로 호출할 수 있습니다.

class 부모(object):
    def __init__(self, 이름, *args, **kwargs):
        print('부모의 __init__ 호출')
        self.이름 = 이름
        print('부모의 __init__ 끝')

class 아들1(부모):
    def __init__(self, 이름, 나이, *args, **kwargs):
        print('아들1의 __init__ 호출')
        self.나이 = 나이
        super().__init__(이름, *args, **kwargs)
        print('아들1의 __init__ 끝')

class 아들2(부모):
    def __init__(self, 이름, 성별, *args, **kwargs):
        print('아들2의 __init__ 호출')
        self.성별 = 성별
        super().__init__(이름, *args, **kwargs)
        print('아들2의 __init__ 끝')

class 손자(아들1, 아들2):
    def __init__(self, 이름, 나이, 성별):
        print('손자의 __init__ 호출')
        super().__init__(이름, 나이, 성별)
        print('손자의 __init__ 끝')

s = 손자('홍길동', 20, '남성')
print('이름:', s.이름)
print('나이:', s.나이)
print('성별:', s.성별)

1.3 단일 상속과 super()

단일 상속에서는 super()를 사용하면 부모 클래스의 메서드를 호출할 수 있습니다.

class 부모(object):
    def __init__(self, 이름):
        print('부모의 __init__ 호출')
        self.이름 = 이름
        print('부모의 __init__ 끝')

class 아들(부모):
    def __init__(self, 이름, 나이):
        print('아들의 __init__ 호출')
        super().__init__(이름)
        self.나이 = 나이
        print('아들의 __init__ 끝')

a = 아들('홍길동', 20)
print('이름:', a.이름)
print('나이:', a.나이)

2. staticmethod, classmethod, 및 property 속성

2.1 클래스 속성과 인스턴스 속성

클래스 속성은 클래스 전체에서 공유되며 인스턴스 속성은 각 인스턴스에 독립적으로 저장됩니다.

class 도시(object):
    # 클래스 속성
    국가 = '한국'

    def __init__(self, 이름):
        # 인스턴스 속성
        self.이름 = 이름

obj = 도시('서울')
print(obj.이름)
print(도시.국가)

2.2 property 속성의 이해

property 속성은 접근자, 설정자, 및 소멸자를 통해 값을 관리할 수 있습니다.

class 페이지(object):
    def __init__(self, current_page):
        self.current_page = current_page
        self.items_per_page = 10

    @property
    def start(self):
        return (self.current_page - 1) * self.items_per_page

    @property
    def end(self):
        return self.current_page * self.items_per_page

p = 페이지(1)
print(p.start)  # 0
print(p.end)    # 10

3.魔法 속성

魔法 속성은 클래스 또는 객체의 특별한 속성으로, Python에서 특정 기능을 구현하기 위해 사용됩니다.

3.1 __doc__

클래스 또는 함수의 설명서를 제공합니다.

class Foo:
    """이 클래스는 설명서를 담고 있습니다."""
    def func(self):
        pass

print(Foo.__doc__)  # "이 클래스는 설명서를 담고 있습니다."

3.2 __module____class__

객체가 속한 모듈과 클래스를 참조합니다.

class Person(object):
    def __init__(self):
        self.이름 = '홍길동'

obj = Person()
print(obj.__module__)  # 출력: __main__
print(obj.__class__)   # 출력: <class '__main__.Person'>

4. with 문과 컨텍스트 관리기

with 문은 리소스를 안전하게 관리하기 위해 사용됩니다.

4.1 파일 다루기

파일을 열고 쓰기完成后 자동으로 닫는 예제입니다.

with open("output.txt", "w") as f:
    f.write("파이썬의 매력")

4.2 컨텍스트 관리기 구현

自分で 컨텍스트 관리기를 구현할 수 있습니다.

class 파일(object):
    def __init__(self, 파일명, 모드):
        self.파일명 = 파일명
        self.모드 = 모드
        self.f = None

    def __enter__(self):
        print("들어가기")
        self.f = open(self.파일명, self.모드)
        return self.f

    def __exit__(self, *args):
        print("나가기")
        if self.f:
            self.f.close()

with 파일('output.txt', 'w') as f:
    f.write("파이썬의 매력")

5. 객체 지향 설계의 기본

객체 지향 프로그래밍의 핵심은 추상화, 캡슐화, 상속, 및多 polymorphism입니다.

5.1 예제: 카메라 클래스

카메라 클래스를 통해 객체 지향 설계의 기본을 이해할 수 있습니다.

class 카메라(object):
    def __init__(self, 브랜드, 화소):
        self.브랜드 = 브랜드
        self.화소 = 화소

    def拍照(self):
        print(f"{self.브랜드} 카메라로 사진을 촬영합니다.")

canon = 카메라('Canon', '24MP')
nikon = 카메라('Nikon', '30MP')

canon.촬영()
nikon.촬영()

태그: 다중 상속 property 속성 with 문 컨텍스트 관리기 객체 지향 프로그래밍

6월 29일 18:06에 게시됨