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.촬영()