반응형
#!/usr/bin/env python
# coding: utf-8
# # 1. 객체지향 프로그래밍(Class) I
# ### 1.1 객체와 클래스
# - 클래스
# - 인스턴스
# - 객체(object)
# In[ ]:
class Car:
def __init__(self):
self._speed = 0
print('자동차가 생성되었습니다.')
def get_speed(self):
return self._speed
def start(self):
self._speed = 20
print('자동차가 출발합니다.')
def accelerate(self):
self._speed = self._speed + 30
print('자동차가 가속합니다.')
def stop(self):
self._speed = 0
print('자동차가 정지합니다.')
# main
my_car = Car()
my_car.start()
print('속도 1: ', my_car.get_speed() )
my_car.accelerate()
print('속도 2: ', my_car.get_speed() )
my_car.stop()
print('속도 3: ', my_car.get_speed() )
# ### 1.2 self
# In[ ]:
class Car:
def __init__(self):
self._speed = 0
def get_speed(self):
return self._speed
def start(self):
self._speed = 20
def accelerate(self):
self._speed = self._speed + 30
def stop(self):
self._speed = 0
# main
my_car1 = Car()
my_car2 = Car()
my_car1.start()
my_car2.start()
my_car1.accelerate()
my_car2.accelerate()
my_car2.accelerate()
print('첫번째 자동차 속도: ', my_car1.get_speed() )
print('두번째 자동차 속도: ', my_car2.get_speed() )
my_car1.stop()
my_car2.stop()
# In[ ]:
class Radio:
def __init__(self):
print('라디오가 생성되었습니다.')
pass
def turn_on(self):
print('라디오를 켭니다')
def turn_off(self):
print('라디오를 끕니다')
class Car:
def __init__(self):
self._speed = 0
print('자동차가 생성되었습니다.')
self._radio = Radio()
def get_speed(self):
return self._speed
def start(self):
self._speed = 20
print('자동차가 출발합니다.')
def accelerate(self):
self._speed = self._speed + 30
print('자동차가 가속합니다.')
def stop(self):
self._speed = 0
print('자동차가 정지합니다.')
def turn_on_radio(self):
self._radio.turn_on()
def turn_off_radio(self):
self._radio.turn_off()
# main
my_car = Car()
my_car.start()
my_car.turn_on_radio()
my_car.accelerate()
my_car.turn_off_radio()
my_car.stop()
# ### 1.3 모듈과 클래스
# #### vehicle.py
#
# ```python
#
# def change_km_to_mile(km):
# return km * 0.621371
#
# def change_mile_to_km(mile):
# return mile * 1.609344
#
#
# class Car:
# def __init__(self):
# self._speed = 0
#
# def get_speed(self):
# return self._speed
#
# def start(self):
# self._speed = 20
#
# def accelerate(self):
# self._speed = self._speed + 30
#
# def stop(self):
# self._speed = 0
#
# class Truck:
# def __init__(self):
# self._speed = 0
#
# def get_speed(self):
# return self._speed
#
# def start(self):
# self._speed = 10
#
# def accelerate(self):
# self._speed = self._speed + 20
#
# def stop(self):
# self._speed = 0
#
#
# if __name__ == '__main__':
# my_car = Car()
# my_car.start()
# my_car.accelerate()
# print('속도: ', my_car.get_speed() )
# my_car.stop()
# ```
# In[ ]:
import vehicle
#import vehicle as vh
#from vehicle import *
my_car = vehicle.Car()
#my_car = vh.Car()
#my_car = Car()
my_car.start()
my_car.accelerate()
speed_mile = vehicle.change_km_to_mile(my_car.get_speed())
#speed_mile = vh.change_km_to_mile(my_car.get_speed())
#speed_mile = change_km_to_mile(my_car.get_speed())
print('속도: ', speed_mile, 'mile' )
my_car.stop()
# ### 1.4 클래스와 데이터 타입
# In[ ]:
type(1)
type(3.14)
isinstance(1, int)
type('Hello World')
isinstance('Hello World', str)
type([1,2,3])
isinstance([1,2,3], list)
type({'line':1, 'rectangle':2, 'triangle':3})
isinstance({'line':1, 'rectangle':2, 'triangle':3}, dict)
# In[ ]:
from vehicle import *
my_car = Car()
type(my_car)
isinstance(my_car, Car)
my_truck = Truck()
type(my_truck)
isinstance(my_truck, Truck)
# ### 1.5 캡슐화와 접근지정
# - 캡슐화(encapsulation)
# - 상속성(inheritance)
# - 다형성(polymorphism)
# In[ ]:
# access_modifiers1
class Car:
def __init__(self):
self.price = 2000
self._speed = 0
self.__color = 'red'
my_car = Car()
print(my_car.price)
print(my_car._speed)
print(my_car.__color)
# In[ ]:
# access_modifiers2
class Car:
def __init__(self):
self._price = 0
self._speed = 0
self._color = None
def get_price(self):
return self._price
def set_price(self, value):
self._price = value
def get_speed(self):
return self._speed
def set_speed(self, value):
self._speed = value
def get_color(self):
return self._color
def set_color(self, value):
self._color = value
# main
my_car = Car()
my_car.set_price(2000)
my_car.set_speed(20)
my_car.set_color('red')
print('가격: ', my_car.get_price())
print('속도: ', my_car.get_speed())
print('색상: ', my_car.get_color())
# ### 1.6 property 이용하기
# In[ ]:
# car_property1
class Car:
def __init__(self):
self._price = 0
self._speed = 0
self._color = None
@property
def price(self):
return self._price
@price.setter
def price(self, value):
self._price = value
@property
def speed(self):
return self._speed
@speed.setter
def speed(self, value):
self._speed = value
@property
def color(self):
return self._color
@color.setter
def color(self, value):
self._color = value
# main
my_car = Car()
my_car.price = 2000
my_car.speed = 20
my_car.color = 'red'
print('가격: ', my_car.price)
print('속도: ', my_car.speed)
print('색상: ', my_car.color)
# In[ ]:
# car_property2
class Car:
def __init__(self):
self._price = 0
self._speed = 0
self._color = None
def get_price(self):
return self._price
def set_price(self, value):
self._price = value
price = property(get_price, set_price)
def get_speed(self):
return self._speed
def set_speed(self, value):
self._speed = value
speed = property(get_speed, set_speed)
def get_color(self):
return self._color
def set_color(self, value):
self._color = value
color = property(get_color, set_color)
# main
my_car = Car()
my_car.price = 2000
my_car.speed = 20
my_car.color = 'red'
print('가격: ', my_car.price)
print('속도: ', my_car.speed)
print('색상: ', my_car.color)
# ### 1.7 예제: 요일 구하기(객체지향)
# In[ ]:
# 년월일을 입력받는 함수
# 반환값: 년월일을 튜플형태로 반환
def input_date():
year = int(input('년도를 입력하시오: '))
month = int(input('월을 입력하시오: '))
day = int(input('일을 입력하시오: '))
return year, month, day
# In[ ]:
# DayName 클래스
class DayName(object):
# DayName 클래스 생성자
def __init__(self, year, month, day):
self._year = year
self._month = month
self._day = day
self._name = None
self._year_month_days = [0,31,28,31,30,31,30,31,31,30,31,30,31]
self._day_names = ['일요일','월요일','화요일','수요일','목요일','금요일','토요일']
# 요일을 계산한다
self._calculate_day_name()
# 윤년인지를 체크하는 메서드
def _is_leap(self, year):
if year % 400 == 0: # 400으로 나뉘는 해: 윤년
return True
elif year % 100 == 0: # 100으로 나뉘는 해: 평년
return False
elif year % 4 == 0: # 4으로 나뉘는 해 : 윤년
return True
else:
return False
# 요일을 계산하는 메서드
def _calculate_day_name(self):
total_days = 0
for item in range(1, self._year):
if self._is_leap(item):
total_days = total_days + 366
else:
total_days = total_days + 365
for item in range(1, self._month):
total_days = total_days + self._year_month_days[item]
if month >= 3:
if self._is_leap(self._year):
total_days = total_days + 1
total_days += self._day
remainder = total_days % 7
self._name = self._day_names[remainder]
# 요일 이름을 반환하는 메서드
def get_name(self):
return self._name
# In[ ]:
# main
year, month, day = input_date()
day_name = DayName(year, month, day)
print( day_name.get_name())
# ### 1.8 예제: 성적 처리 시스템(객체지향)
# In[ ]:
# student
class Student(object):
def __init__(self, num, name, kor, eng, math):
# 학생의 속성
self._num = num
self._name = name
self._kor = kor
self._eng = eng
self._math = math
self._total = 0
self._avg = 0.0
self._order = 0
# 총점과 평균을 구한다.
self._calculate_total()
self._calculate_avg()
def _calculate_total(self):
self._total = self._kor + self._eng + self._math
def _calculate_avg(self):
self._avg = self._total / 3
@property
def num(self):
return self._num
@property
def name(self):
return self._name
@property
def kor(self):
return self._kor
@property
def eng(self):
return self._eng
@property
def math(self):
return self._math
@property
def total(self):
return self._total
@property
def avg(self):
return self._avg
@property
def order(self):
return self._order
@order.setter
def order(self, value):
self._order = value
# In[ ]:
# grade_system
class StudentGradeSystem(object):
def __init__(self):
# 학생 객체를 저장할 리스트
self._students = []
# 반 성적을 저장할 속성
self._class_avg = 0.0
self._kor_avg = 0.0
self._eng_avg = 0.0
self._math_avg = 0.0
# 학생 등수를 구한다.
def _calculate_student_order(self):
temp_students = sorted(self._students, key = lambda x: x.total, reverse = True)
order = 1
for student in temp_students:
student.order = order
order = order + 1
self._students = temp_students
# 반 평균을 구한다.
def _calculate_class_avg(self):
total = 0
for student in self._students:
total = total + student.total
self._class_avg = total / len(self._students)
# 국어 평균을 구한다.
def _calculate_kor_avg(self):
total = 0
for student in self._students:
total = total + student.kor
self._kor_avg = total / len(self._students)
# 영어 평균을 구한다.
def _calculate_eng_avg(self):
total = 0
for student in self._students:
total = total + student.eng
self._eng_avg = total / len(self._students)
# 수학 평균을 구한다.
def _calculate_math_avg(self):
total = 0
for student in self._students:
total = total + student.math
self._math_avg = total / len(self._students)
# 반 성적 정보를 구한다.
def _calculate_class_information(self):
self._calculate_class_avg()
self._calculate_kor_avg()
self._calculate_eng_avg()
self._calculate_math_avg()
# 학생 객체를 등록한다.
def register_student(self, student):
self._students.append(student)
# 학생 성적 및 반 성적을 처리한다.
def process(self):
self._calculate_student_order() # 학생 순위를 구한다.
self._calculate_class_information() # 반 성적 정보를 구한다.
# 학생 성적을 출력한다.
def print_students(self):
for student in self._students:
print('번호: {:s}, 이름: {:s}, 국어: {:d}, 영어: {:d}, 수학: {:d}, 총점: {:d}, 평균: {:.2f}, 등수: {:d}'.format(
student.num, student.name,
student.kor, student.eng, student.math,
student.total, student.avg, student.order)
)
# 반 성적 정보를 출력한다.
def print_class_information(self):
print('반 평균 : {:.2f}'.format(self._class_avg))
print('국어 평균: {:.2f}'.format(self._kor_avg) )
print('영어 평균: {:.2f}'.format(self._eng_avg) )
print('수학 평균: {:.2f}'.format(self._math_avg) )
# In[ ]:
# main
student_grade_system = StudentGradeSystem()
student = Student('1', '김철수', 90, 80, 85)
student_grade_system.register_student(student)
student = Student('2', '박제동', 90, 85, 90)
student_grade_system.register_student(student)
student = Student('3', '홍길동', 80, 80, 80)
student_grade_system.register_student(student)
student_grade_system.process()
student_grade_system.print_students()
print()
student_grade_system.print_class_information()
# ---
# In[ ]:
# end of file
# In[ ]:
반응형
LIST
'Programming' 카테고리의 다른 글
[Python][문법] 기초 - 7. 파일 입출력_예외처리 (0) | 2022.01.02 |
---|---|
[Python][문법] 기초 - 6. Class 2 (0) | 2022.01.02 |
[Python][문법] 기초 - 4. 함수 (0) | 2022.01.02 |
[Python][문법] 기초 - 3. 연산자_흐름제어 (0) | 2022.01.02 |
[Python][문법] 기초 - 2. 변수 타입 (0) | 2022.01.02 |