이것저것 코드/파이썬

[파이썬] 게시물에 반응하기 - 페이스북 좋아요/화나요 댓글 반응

원-스텝 2022. 9. 4. 19:04
반응형
게시물에 반응하기
Facebook에서는 좋아요 말고도 슬퍼요, 웃겨요 등의 반응을 남길 수 있습니다. 이 반응들은 공통적인 특성들을 갖지만, 분명 서로 다른 독립적인 성질을 갖고 있습니다. 추상적인 클래스를 활용하면 이 성질을 잘 나타낼 수 있습니다.

먼저, 모든 반응을 총칭하는 Reaction 클래스를 정의합니다. Reaction 클래스는 다음의 세 가지 속성을 갖습니다.
reaction_type: Reaction의 종류를 나타냅니다. 알파벳 대문자로 이루어진 문자열이며, “LIKE”, “LOVE”, “HAHA”, “SAD”, “ANGRY”, “WOW” 중 하나입니다. 이 6개 이외의 값이 들어올 경우 ValueError가 발생합니다.
post: Reaction을 남긴 게시물입니다. Post 인스턴스여야 합니다. 아닐 경우, TypeError가 발생합니다.
user: Reaction을 남긴 사용자입니다. User 인스턴스여야 합니다. 아닐 경우, TypeError가 발생합니다.
Reaction 클래스의 생성 시점에, 주어진 post의 reactions에 자기 자신을 추가합니다. reactions는 Reaction 인스턴스의 리스트입니다.

Reaction의 자식 클래스 Like(좋아요)와 Angry(화나요)를 구현합니다.
Like와 Angry는 Reaction의 속성을 똑같이 갖습니다. 단, Like의 reaction_type은 "LIKE"이고, Angry의 reaction_type은 "ANGRY"입니다. 따라서, 자식 클래스들의 생성자는 post와 user, 두 개의 인자만 받습니다.
Like는 생성 시점에 이 리액션이 달린 Post의 positive_reactions의 값을 1만큼 증가시킵니다.
Angry는 생성 시점에 이 리액션이 달린 Post의 negative_reactions의 값을 1만큼 증가시킵니다.
from utils import User, Post

class Reaction:
    # 아래 코드의 빈 부분을 완성합니다.
    def __init__(self, reaction_type, post, user):
        reaType = ["LIKE", "LOVE", "HAHA", "SAD", "ANGRY", "WOW"]
        if reaction_type not in reaType:
            raise ValueError('aaa')
        if not isinstance(post, Post):
            raise TypeError('post는 Post 인스턴스여야 합니다.')
        if not isinstance(user, User):
            raise TypeError('user는 User 인스턴스여야 합니다.')
        self.reaction_type = reaction_type
        self.post = post
        self.user = user

        post.reactions.append(self)

# 아래 코드의 빈 부분을 완성합니다.
class Like(Reaction):
    def __init__(self, post, user):
        super().__init__("LIKE", post, user)
        post.positive_reactions += 1

class Angry(Reaction):
    def __init__(self, post, user):
        super().__init__("ANGRY", post, user)
        post.negative_reactions += 1
반응형