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]:
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)
In [7]:
kipoy = FastcampusPerson("김기표")
jkpark = FastcampusPerson("박재근", is_manager=True)
In [8]:
wps.add_student(jkpark, kipoy)
In [9]:
wps.add_student(kipoy, donguk)
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]:
In [15]:
animals.add("dog")
In [16]:
animals
Out[16]:
In [17]:
animals = []
animals.append("dog")
In [18]:
animals.append("dog")
In [19]:
animals
Out[19]:
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]:
In [23]:
wps.show_students(jkpark), wps.show_revenue(jkpark)
Out[23]:
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
Out[25]:
In [26]:
wps.show_students(jkpark), wps.show_revenue(jkpark)
Out[26]:
In [73]:
# Role 이 2개 뿐이 없다. ( 학생, 매니저 )
# 코스 => 캠프, 스쿨
# "강의장 사정" => 스쿨 기본 최대 인원은 20명
# School 객체 => 매니저를 통해서 스쿨 과정이 생기는거다.
# School_object.add_student ( X )
# Manager_object.add_student(school_object, student_object) (O)
In [ ]: