fastcampus 사례로 실습


In [2]:
class FastcampusPerson():  # 패스트캠퍼스에 있는 사람 한명 한명
    # 학생과 매니저가 구분될 수 있어야 합니다.
    # 00님 => 1기 데사스, 2기 웹프스
    # 00님 => 1기 수강생 => 매니저에 의해서 매니저로 임명
    
    def __init__(self, name, is_manager=False):  #manager인 경우에 True로 바뀐다.
        self.name = name
        self.is_manager = is_manager
        
        # 만약 **kwargs 로 받았다면,
        # self.is_manager = kwargs.get("is_manager", False)
    
    def __str__(self):
        return self.name

In [3]:
jypark = FastcampusPerson("박준영", is_manager=True)
donguk = FastcampusPerson("동욱님")

In [4]:
jypark.is_manager, donguk.is_manager


Out[4]:
(True, False)

In [5]:
class FastcampusSchool():  # 패스트캠퍼스 스쿨 관리 클래스
    
    def __init__(self, name):
        self.name = name
        self.students = []
        # manager_list = []
    
    def add_student(self, manager, student):
        if manager.is_manager:
            print("매니저 '{manager}' 이/가 학생 '{student}' 을/를 추가했습니다.".format(
                manager=manager.name,   # manager => FastcampusPerson object,
                student=student.name,   # student => FastcampusPerson object,
            ))
            
    # 단, 학생이 학생을 초대하면 ('add_student') => 에러가 발생해야 한다.
    
        else:
            raise PermissionDeniedError(manager)
    
    def show_students(self, manager):
        pass

    
    def show_revenue(self, manager):
        pass
        # 전체 매출을 구하는 애 ( 학생 수 * 360 )
        # 학생이 전체 매출을 구하려고 하면, => 에러가 발생해야 합니다.

    def __str__(self):
        return self.name

In [6]:
wps = FastcampusSchool("웹 프로그래밍 SCHOOL")
print(wps)


웹 프로그래밍 SCHOOL

In [7]:
kipoy = FastcampusPerson("김기표")
jkpark = FastcampusPerson("박재근", is_manager=True)

In [8]:
wps.add_student(jkpark, kipoy)


매니저 '박재근' 이/가 학생 '김기표' 을/를 추가했습니다.

In [9]:
wps.add_student(kipoy, donguk)


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-9-589270cc44a3> in <module>()
----> 1 wps.add_student(kipoy, donguk)

<ipython-input-5-2df0db3a7658> in add_student(self, manager, student)
     16 
     17         else:
---> 18             raise PermissionDeniedError(manager)
     19 
     20     def show_students(self, manager):

NameError: name 'PermissionDeniedError' is not defined

In [10]:
class PermissionDeniedError(Exception):
    
    def __init__(self, person):
        self.person = person
    
    def __str__(self):
        return "{name} 는/은 매니저가 아니라서, 권한이 없습니다.".format(
            name=self.person.name,
        )

In [11]:
class FastcampusSchool():
    
    def __init__(self, name):
        self.name = name
        self.students = set()
        # manager_list = []
    
    def add_student(self, manager, student):
        if not manager.is_manager:
            raise PermissionDeniedError(manager)
        print("매니저 '{manager}' 이/가 학생 '{student}' 을/를 추가했습니다.".format(
                manager=manager.name,  
                student=student.name, 
        ))
        self.students.add(student)

    def show_students(self, manager):
        pass

    
    def show_revenue(self, manager):
        pass
        # 전체 매출을 구하는 애 ( 학생 수 * 360 )
        # 학생이 전체 매출을 구하려고 하면, => 에러가 발생해야 합니다.

    def __str__(self):
        return self.name

In [48]:
# class StudentAlreadyInSchool(Exception):
#     def __init__(self, person):
#         self.person = person
        
#     def __str__(self):
#         pass

이렇게 예외처리 하는 것이 올바른 구현일까?
그렇다고 해서 2개의 다른 오류를 하나로 묶을 수는 없다.
대신 우리가 배운 자료구조를 쓰면 된다. 그래서  부분 제거
어차피 student가 중복을 포함하지 않는 집합이니까 students는 list보다 set이  적합

In [12]:
animals = set()

In [13]:
animals.add("dog")

In [14]:
animals


Out[14]:
{'dog'}

In [15]:
animals.add("dog")

In [16]:
animals


Out[16]:
{'dog'}

In [17]:
animals = []
animals.append("dog")

In [18]:
animals.append("dog")

In [19]:
animals


Out[19]:
['dog', 'dog']

In [21]:
class FastcampusSchool():
    
    def __init__(self, name, *args, **kwargs):
        self.name = name
        self.students = set()
        self.tuition = kwargs.get("tuition", 480) 
        # 수강료가 따로 입력되지 않으면, 기본으로 480만원
        # manager_list = []
    
    def add_student(self, manager, student):
        if not manager.is_manager:
            raise PermissionDeniedError(manager)
        print("매니저 '{manager}' 이/가 학생 '{student}' 을/를 추가했습니다.".format(
                manager=manager.name,  
                student=student.name, 
        ))
        self.students.add(student)

    def show_students(self, manager):
        if not manager.is_manager:
            raise PermissionDeniedError(manager)
        print("----------------------------")
        print("--- Student/Manager List ---")
        print("----------------------------")
        message = "\n".join([
            "{name} ( {role} )".format(
                name=student.name,
                role="Manager" if student.is_manager else "Student"
            )
            for student 
            in self.students
        ])
        print(message)
        print("----------------------------")

    def show_revenue(self, manager):
        # 전체 매출을 구하는 애 ( 학생 수 * 360 )
        # 학생이 전체 매출을 구하려고 하면, => 에러가 발생해야 합니다.
        total_revenue = len(self.students) * self.tuition
        print("----------------------------")
        print("{total_students} 명 * {tuition} 만원".format(total_students=len(self.students), tuition=self.tuition))
        print("=> {total_revenue} 만원".format(total_revenue=total_revenue))
        print("----------------------------")

    def __str__(self):
        return self.name

In [22]:
wps = FastcampusSchool("웹 프로그래밍 SCHOOL", tuition=360)
kipoy = FastcampusPerson("김기표")
jkpark = FastcampusPerson("박재근", is_manager=True)
wps.add_student(jkpark, kipoy)
wps.add_student(jkpark, donguk)
wps.students


매니저 '박재근' 이/가 학생 '김기표' 을/를 추가했습니다.
매니저 '박재근' 이/가 학생 '동욱님' 을/를 추가했습니다.
Out[22]:
{<__main__.FastcampusPerson at 0x8b3d0b8>,
 <__main__.FastcampusPerson at 0x8b2c630>}

In [23]:
wps.show_students(jkpark), wps.show_revenue(jkpark)


----------------------------
--- Student/Manager List ---
----------------------------
동욱님 ( Student )
김기표 ( Student )
----------------------------
----------------------------
2 명 * 360 만원
=> 720 만원
----------------------------
Out[23]:
(None, None)

In [24]:
import inspect

class PermissionDeniedError(Exception):
    
    def __init__(self, person):
        self.person = person
    
    def __str__(self):
        return "{name} 은 매니저가 아니라서, 권한이 없습니다.".format(
            name=self.person.name,
        )


# 일단은 Function Decorator를 만들자.
def is_manager(function):
    def wrapper(*args, **kwargs):
        #school, manager, student = args   # 범용성을 위해서 이 부분이 수정이 되어야 합니다.
                                          # args => manager 라고 되어있는 부분
                                          # args => 변수가 뭐가 뭔지 전혀 모른다.
                
        new_kwargs = inspect.getcallargs(function, *args, **kwargs)
        # args = {"dobestan", "24"}
        # kwargs = {"favorite": "python", ...}
        # => new_kwargs = {"name": "dobestan", "age": "24", "favorite": "python", ...}
        print(new_kwargs)
        
        manager = new_kwargs.get("manager")
        
        if not manager.is_manager:
            raise PermissionDeniedError(manager)
        return function(*args, **kwargs)
    return wrapper


class FastcampusSchool():  # 패스트캠퍼스 스쿨 관리 클래스

    def __init__(self, name, *args, **kwargs):
        self.name = name
        self.students = set()
        self.tuition = kwargs.get("tuition", 480)  # 수강료가 따로 입력되지 않으면, 기본으로 480만원
    
    @is_manager
    def add_student(self, manager, student):
        print("매니저 '{manager}' 이/가 학생 '{student}' 을/를 추가했습니다.".format(
            manager=manager.name,   # manager => FastcampusPerson object,
            student=student.name,   # student => FastcampusPerson object,
        ))
        self.students.add(student)
        
        
    @is_manager
    def show_students(self, manager):
        print("----------------------------")
        print("--- Student/Manager List ---")
        print("----------------------------")
        message = "\n".join([
            "{name} ( {role} )".format(
                name=student.name,
                role="Manager" if student.is_manager else "Student"
            )
            for student 
            in self.students
        ])
        print(message)
        print("----------------------------")
        
        
    @is_manager
    def show_revenue(self, manager):
        # 전체 매출을 구하는 애 ( 학생 수 * 360 )
        # 학생이 전체 매출을 구하려고 하면, => 에러가 발생해야 합니다.
        total_revenue = len(self.students) * self.tuition
        print("----------------------------")
        print("{total_students} 명 * {tuition} 만원".format(total_students=len(self.students), tuition=self.tuition))
        print("=> {total_revenue} 만원".format(total_revenue=total_revenue))
        print("----------------------------")

    def __str__(self):
        return self.name

In [25]:
wps = FastcampusSchool("웹 프로그래밍 SCHOOL", tuition=360)
kipoy = FastcampusPerson("김기표")
jkpark = FastcampusPerson("박재근", is_manager=True)
wps.add_student(jkpark, kipoy)
wps.add_student(jkpark, donguk)
wps.students


{'manager': <__main__.FastcampusPerson object at 0x0000000008B2CC18>, 'student': <__main__.FastcampusPerson object at 0x0000000008CD6860>, 'self': <__main__.FastcampusSchool object at 0x0000000008CD67B8>}
매니저 '박재근' 이/가 학생 '김기표' 을/를 추가했습니다.
{'manager': <__main__.FastcampusPerson object at 0x0000000008B2CC18>, 'student': <__main__.FastcampusPerson object at 0x0000000008B3D0B8>, 'self': <__main__.FastcampusSchool object at 0x0000000008CD67B8>}
매니저 '박재근' 이/가 학생 '동욱님' 을/를 추가했습니다.
Out[25]:
{<__main__.FastcampusPerson at 0x8b3d0b8>,
 <__main__.FastcampusPerson at 0x8cd6860>}

In [26]:
wps.show_students(jkpark), wps.show_revenue(jkpark)


{'manager': <__main__.FastcampusPerson object at 0x0000000008B2CC18>, 'self': <__main__.FastcampusSchool object at 0x0000000008CD67B8>}
----------------------------
--- Student/Manager List ---
----------------------------
동욱님 ( Student )
김기표 ( Student )
----------------------------
{'manager': <__main__.FastcampusPerson object at 0x0000000008B2CC18>, 'self': <__main__.FastcampusSchool object at 0x0000000008CD67B8>}
----------------------------
2 명 * 360 만원
=> 720 만원
----------------------------
Out[26]:
(None, None)

In [73]:
# Role 이 2개 뿐이 없다. ( 학생, 매니저 )
# 코스 => 캠프, 스쿨
# "강의장 사정" => 스쿨 기본 최대 인원은 20명 

# School 객체 => 매니저를 통해서 스쿨 과정이 생기는거다. 
# School_object.add_student ( X )
# Manager_object.add_student(school_object, student_object) (O)

In [ ]: