자료의 출처는 엘리스 AI 트랙(https://aitrack.elice.io/) '파이썬 객체지향 프로그래밍' 이며, 학습 후 정리한 내용입니다.
⚡️올바르지 않은 내용이 있을 경우 댓글로 남겨주시면 감사하겠습니다.⚡️
클래스 더 알아보기
클래스의 상속
왜 상속이 필요한가요?
여러 클래스가 비슷한 속성과 메소드를 공유해야 할 때
서로 다른 클래스 간의 계층 구조가 확실할 때
페이스북 게시물
게시물 | 글만 있는 게시물 |
사진을 포함한 게시물 | |
동영상을 포함한 게시물 | |
링크를 포함한 게시물 |
게시물
class Post:
def __init__(self, content): # 생성자
self.content = content
이미지가 있는 게시물
class ImagePost:
def __init__(self, content, images):
self.content = content
self.images = images
# 상속을 배우지 않는다면 이런식으로 정의를 할 것
상속을 하지 않을 경우 단점
- 코딩시간
- 실수할 확률이 높아짐
class ImagePost:
def __init__(self, content, images):
...
def num_images(self): # 중복된 내용의 속성을 정의하지 않는 메소드 - 이미지의 개수 메소드
return len(self.images)
# Post에는 없는 메소드 생성
클래스의 상속
부모 (부모의 속성, 메소드) -> 자식 (부모+ 자식의 속성, 메소드)
# 자식은 기본적으로 부모의 모든 것을 상속받을 수 있고, 원하지 않으면 상속받지 않을 수 있다.
# 파이썬 에서만 부모의 속성을 모두 상속받을 수 있다.(자바의 경우, 부모에게도 결정권이 있음 - private)
청출어람의 법칙
부모 클래스보다 자식 클래스가 더 많은 데이터와 기능을 갖고 있다!
상속 따라하기1
클래스 선언
class ImagePost(Post): #()안에 들어가 있다는 것이 차이 - (부모 class)
...
생성자
class ImagePost(Post):
def __init__(self, content, images):
super().__init__(content) # super(): 파이썬의 기본 함수, 부모 클래스에 접근할 때 사용
self.images = images
# 생성자는 이 클래스가 어떤 속성들을 가지는지 정리해주는 메소드이다
# 생성자가 잘못되면 나머지 메소드도 작동하지 않게 된다.
부모 인스턴스 동시 생성
class ImagePost(Post):
def __init__(self, content, images):
super().__init__(content)
self.images = images
자식을 생성하면 연결되는 부모 인스턴스도 생성됨.
속성 상속
class Post:
def __init__(self, content):
self.content = content
self.likers = [] # 생성 시점에는 빈 likers가 들어감.
class ImagePost(Post):
...
my_post = ImagePost(alice, "강남맛집")
print(my_post.likers) # []
메소드 상속
class Post:
def like(self, user):
self.likers.append(user) #likers: 속성 / append: 리스트이 메소드
class ImagePost(Post):
...
my_post = ImagePost(alice, "강남맛집")
my_post.like(bob)
상속 따라하기 2
좋아요, 슬퍼요
class Like:
def __init__(self, post, user):
self.post = post
self.user = user
class Sad:
def __init__(self, post, user):
self.post = post
self.user = user
추상적인 부모 클래스
class Reaction:
def __init__(self, type, post, user):
self.type = type
self.post = post # Sad, Like class와 post, user 속성을 공유함
self.user = user
class Like(Reaction):
def __init__(self, post, user):
super().__init__("LIKE", post, user)
#내가받은(자식이) 매개변수 -> 부모 생성자의 인자로 사용
class Sad(Reaction):
def __init__(self, post, user):
super().__init__("SAD", post, user) #Like와 type이 정확히 다르다.
// 이렇게 쓰진 않는다!
reaction = Reaction("vasdjkl", post, me) #버그
// 반드시 구체적인 자식 클래스로 쓴다.
like = Like(post, me)
오버라이딩
오버라이딩: 자식이 부모를 거역하는 것
클래스 설계 상황
모든 게시물에는 댓글을 달 수 있지만, 보호 설정을 한 게시물에는 예외저으로 댓글을 달 수 없다.
오버라이딩
class Post:
def comment(self, user, content):
self.comments.append(Comment(user, content))
class ProtectedPost(Post):
def comment(self, user, content):
print("Can't comment on protected posts.")
반응형
'IT > Python' 카테고리의 다른 글
파이썬 크롤링-01. 크롤링의 기초 (0) | 2021.06.21 |
---|---|
객체지향 프로그래밍-04. 모듈과 패키지 (0) | 2021.06.21 |
파이썬 객체지향 프로그래밍-02. 클래스 입문 (0) | 2021.06.20 |
파이썬 객체지향 프로그래밍-01. 함수 (0) | 2021.06.20 |
도레미 파이썬: 객체 (0) | 2021.06.16 |
댓글