파이썬 기초 - 클래스와 객체, 모듈과 패키지, 예외처리

LSH·2023년 5월 19일
0

교육 정보

  • 교육 명: 경기미래기술학교 AI 교육
  • 교육 기간: 2023.05.08 ~ 2023.10.31
  • 오늘의 커리큘럼: 빅데이터 기초 활용 역량 강화 (5/10~6/9) - 파이썬 프로그래밍
  • 강사: 조미정 강사님 (빅데이터, 머신러닝, 인공지능)
  • 강의 계획:
    1. 파이썬 언어 기초 프로그래밍
    2. 크롤링 - 데이터 분석을 위한 데이터 수집(파이썬으로 진행)
    3. 탐색적 데이터 분석, 분석 실습
    - 분석은 파이썬만으로는 할 수 없으므로 분석 라이브러리/시각화 라이브러리를 통해 분석
    4. 통계기반 데이터 분석
    5. 미니프로젝트
  • 본 페이지에서는 아래 항목들을 예시를 통해 기본적인 개념만 정리하고 넘어간다.
    • 클래스와 객체
    • 모듈과 패키지
    • 예외 처리

1. 클래스와 객체

클래스와 객체의 개념

  • 객체 = 데이터 + 속성(기능)
  • 클래스 = 객체의 특정 속성을 정의
  • 객체는 클래스를 이용하여 생성
    • 객체 = 클래스()

클래스를 사용한 객체의 생성

  • 클래스를 새로 정의하거나 이미 존재하는 클래스를 변형할 수 있음
class Car:                    # 클래스의 정의. 클래스 명은 Pascal Case를 권장(MyClass)
    car_count = 0             # 클래스변수. 해당 클래스로 만들어진 모든 객체가 공유함
    # 필드 중 이중 밑줄을 가지는 경우 클래스와 객체 내부에서만 접근 가능하도록 은님됨 
    # 외부 접근시 @classmethod 데커레이터를 붙여서 클래스 메소드로 지정함
    def __init__(self, name, color):  # init 메소드. class로 객체를 생성할때의 생성자(가장 먼저 실행되어 초기 값을 객체에 전달) 
    # 첫 매개변수 = self. 클래스로 생성한 객체 자체를 의미
        self.name = name   
        self.color = color     # 객체변수. 클래스변수랑 다르게 하나의 오브젝트가 소유하는 값이고 함수가 아니라서 ()없이 콜함
        Car.car_count += 1
        print(f"Car class로 객체 생성. 생성된 객체 수: {Car.car_count}")
    def drive(self):    
        print('drive')         # 내장함수. ()붙여서 
    def destroy(self):
        Car.car_count -= 1
        print("destroy", Car.car_count)   #클래스 변수에는 이런식으로 접근 가능 <클래스명.클래스변수명>
         def __del__(self):         #소멸자. 객체를 완전히 메모리에서 제거함 
        print("메모리에서 제거됩니다.")
car1 = Car('그랜져', "검정") 
print(car1.name, car1.color, "를 구매했습니다")
del car1
car2 = Car("지바겐", "검정")
print(car2.name, car2.color, car2.drive())
car2.destroy()
#
#결과
Car class로 객체 생성. 생성된 객체 수: 1
그랜져 검정 를 구매했습니다
메모리에서 제거됩니다.
Car class로 객체 생성. 생성된 객체 수: 2
drive
지바겐 검정 None
destroy 1

클래스의 상속

  • 클래스간의 부모/자식 관계를 구현해서 상위(부모)클래스의 속성을 하위(자식)클래스에 적용할 수 있음
# 상위(부모) 클래스 정의
class NewSchoolMember:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print('SchoolMember: {} 생성'.format(self.name))
    def tell(self):
        print("SchoolMember name:", self.name, "SchoolMember age:", self.age, end = " ")
# 하위(자식) 클래스 정의 1
class Teacher(NewSchoolMember):
    def __init__(self, name, age, salary):
        NewSchoolMember.__init__(self, name, age)
        self.salary = salary
        print('선생님 {} 이 생성되었습니다'.format(self.name))
    def tell(self):
        NewSchoolMember.tell(self)
        print("SchoolMember salary:", self.salary)
# 하위(자식) 클래스 정의 2
class Student(NewSchoolMember):
    def __init__(self, name, age, marks):
        NewSchoolMember.__init__(self, name, age)
        self.marks = marks
        print('학생 {} 이 생성되었습니다'.format(self.name))
    def tell(self):
        NewSchoolMember.tell(self)
        print("SchoolMember marks:", self.marks)
# 하위(자식) 클래스 정의 3    
class Dog(NewSchoolMember):
    def __init__(self, name, age):
        NewSchoolMember.__init__(self, name, age)
        print('강아지{} 이 생성되었습니다'.format(self.name))
# 객체 생성
t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Swaroop', 25, 75)
s = Dog('happy',2)
members = [t, s]
for member in members:
    # 교사, 학생 객체를 상위 객체 NewSchoolMember로 취급
    member.tell()
#
#결과
SchoolMember: Mrs. Shrividya 생성
선생님 Mrs. Shrividya 이 생성되었습니다
SchoolMember: Swaroop 생성
학생 Swaroop 이 생성되었습니다
SchoolMember: happy 생성
강아지happy 이 생성되었습니다
SchoolMember name: Mrs. Shrividya SchoolMember age: 40 SchoolMember salary: 30000
SchoolMember name: Swaroop SchoolMember age: 25 SchoolMember marks: 75
# 위 두줄 (선생과 학생 객체의 tell 메소드)를 통해 둘의 메소드가 같은 이름이지만 각각 다르게 동작하였음을 알 수 있음(다형성)
SchoolMember name: happy SchoolMember age: 2 
# Dog 클래스의 tell 메소드는 따로 오버라이딩하지 않아 상위 클래스인 SchoolMember의 tell 메소드가 그대로 동작함

2. 모듈과 패키지

모듈과 패키지의 개념

  • 모듈은 미리 작성된 함수 코드를 모아놓은 .py파일로, 이미 작성한 프로그램의 여러 기능을 다른 프로그램에 불러와 재사용 하고자 할때 사용함
  • 파이선 표준 모듈 라이브러리: 파이썬 설치시 같이 설치됨
    • 모듈 불러오기: import 모듈명
    • 모듈 내 함수 호출: 모듈명.함수명()
    • 모듈 내의 함수 중 일부만 불러올경우: from 모듈명 import 함수명 (이 경우 함수명()만으로 함수 호출 가능)
    • 별칭alias 지정: import 모듈명/함수명 as 별칭
    • 참고: [https://docs.python.org/3/library/]
  • 사용자 정의 모듈 만들기
    • 프로그램을 작성 후 .py 파일로 저장
    • 파일 이름을 통해 import
  • 패키지는 여러 모듈을 구조적으로 관리하는 방법
    • 폴더 생성 후 해당 폴더에 init.py 생성하면 해당 폴더를 패키지로 사용
# .py 파일 = 모듈, 폴더 = 패키지
game/
  sound/
    sound1.py
    sound2.py
  character/
    char1.py
  graphic/

3. 예외 처리

예외

  • 내장 예외(파이썬에서 미리 만들어놓은 예외) 및 사용자 정의 예외를 생성
    • 어떤 예외가 발생해도 프로그램이 비정상 종료 되므로 예외처리를 함
# 사용자 정의 예외 생성 
#UserNotFoundError 라는 이름의 사용자 정의 예외 작성
class UserNotFoundError(Exception):
  def __init__(self):
    super().__init__('Can not find the user.')
if True:
  raise UserNotFoundError # 방금 만든 예외를 발생 시킴 
#
#결과
UserNotFoundError: Can not find the user.

예외 처리

  • try - except - else - finally 구문을 상황에 맞게 변형하여 사용
try:
  실행할 코드
except:
  예외 발생 시 처리하는 코드
else:
  예외 발생하지 않았을 시 처리하는 코드
finally:
  예외 발생 여부와 상관 없이 항상 처리 해야 되는 코드
try:
  list = [1,2]
  x = int(input('숫자를 입력해주세요: '))
  result = 10/x
  print(list[int(result)])
except ZeroDivisionError as e:
  print("0이 아닌 수를 입력하세요.", e)
except IndexError as e:
  print("인덱스를 벗어났어요.", e)
else:
  print("결과가 출력되었습니다")
finally:
  print("프로그램이 종료되었습니다")
#
# 결과
# 0 입력시
숫자를 입력해주세요: 0
0이 아닌 수를 입력하세요. division by zero
프로그램이 종료되었습니다
# 10 입력시
숫자를 입력해주세요: 10
2
프로그램이 종료되었습니다
# 2 입력시 
숫자를 입력해주세요: 2
인덱스를 벗어났어요. list index out of range
프로그램이 종료되었습니다

raise를 통해 예외 발생시키기

  • 내장, 사용자 정의 예외를 코드 내에서 직접 발생시킬 수 있음
# 숫자를 입력하고 5의 배수가 아닐 경우 예외를 발생
try:
  x = int(input('숫자를 입력하세요 : '))
  if x % 5 != 0:
    raise Exception("5의 배수가 아닙니다.") # 사용자가 에러 발생
except Exception as e:
  print("에러발생 -", e)
else:
  print(x)
#
#결과
숫자를 입력하세요 : 6
에러발생 - 5의 배수가 아닙니다.
profile
:D

0개의 댓글