#예외처리
프로세스가 더 이상 동작하지 못하는 상황일 때 예외가 발생한다.
(내부적으로 raise 구문으로 예외 발생시킨 것임)
try:
실행할 코드
except 예외1:
예외(=에러)가 발생했을 때 처리하는 코드 -
else:
예외가 발생하지 않았을 때의 처리
finally:
예외가 발생하든 하지 않든 반드시 해야하는 처리
-예제1
num1 =int(input("정수입력"))
num2 =int(input("정수입력"))
try:
print(num1/num2)
except:
print("에러")
else:
print("에러x")
finally:
print("반드시 처리")
"""
정수입력4
정수입력2
2.0
에러x
반드시 처리
-------------
정수입력3
정수입력0
에러
반드시 처리
"""
-2
#예외를 발생시키기
def getSum(start,end,step=1):
if start > end:
raise ValueError #예외를 발생시킨다
s=0
for i in range(start,end+1,step):
s+=i
return s
try:
print(getSum(2,10))
print(getSum(10,2))
except:
print("예외발생")
"""
54
예외발생
"""
#모듈
특정 목적을 위한 코드를 하나의 소스 파일에 정의한 것 => 관련있는 형식이나 기능을 모아서 정의한 코드 집합
함수나 변수 또는 클래스를 모아 놓은 파일이다.
.py 는 모두 모듈
- Abcd.py 파일이 있을 때 모듈 이름은 Abcd
- Abcd 모듈에 있는 것을 사용하고자 할 때 : import Abcd
- Abcd 모듈에 foo 함수가 있을 때 Abcd.foo() 와 같은 형태로 사용할 수 있다.
- 축약해서 사용할 때, from Abcd import foo foo() 처럼 사용할 수 있다.
- 모듈 이름을 축약(별칭) import Abcd as A A.foo() 처럼 사용할 수 있다.
#__name__
- 파이썬이 내부적으로 사용하는 특별한 변수 이름
- main이라 이해하면 된다 ->즉 프로그램 진입점 entty point
- __main__의 값을 가진다.
- __name__== __main__
#클래스 캡슐화
- 프로그램에서 관리할 데이터 등을 개발자가 형식으로 정의하여 사용할 수 있다.
- 클래스를 이용하면 멤버 필드와 멤버 메서드를 캡슐화할 수 있다.
- 클래스의 파생 문법을 이용하면 기반 형식의 멤버를 상속받을 수 있다.
- 기반 형식에 정의한 메서드를 파생 형식에서 다시 정의하면 재정의로 취급한다.
멤버 이름에 __로 시작하면 가시성이 차단(private)
#생성자
클래스 이름과 같은 함수
class 클래스 이름:
def __init__(self , 추가적인 매개변수): //self : 자기자신을 나타내는 딕셔너리
class Student: #현재 접근하고 있는 학생은 self
def __init__(self,num,name): #__init 초기화함수, 생성자함수, 생성메소드다. 학생이 만들어질 때 실행하는 함수
self.num = num #나의 이번호
self.name = name
self.iq=0
def introduce(self): #멤버메소드
print(f"번호는 {self.num}, 이름은 {self.name} 아이큐는 {self.iq} 입니다.")
def study(self): #멤버메소드
self.iq+=1
print(f"{self.name} : 밥먹자")'
s1 = Student(1, "독고길동") #번호,이름 넣기
s1.introduce()
s1.study()
s1.study()
s1.introduce()
"""
번호는 1, 이름은 독고길동 아이큐는 0 입니다.
독고길동 : 밥먹자
독고길동 : 밥먹자
번호는 1, 이름은 독고길동 아이큐는 2 입니다.
study() 두번 호출해서 아이큐 +2
"""
#정보은닉
캡슐화 과정에서 특정 멤버의 가시성을 차단하는 방법 -> 멤버 앞에 __를 붙이면 은폐(private)
사용하는 곳에서 직접 사용하지 못하며 형식 내부에서만 사용하게 하는 기법
데이터 신뢰성을 높이는 방법으로 사용한다.
#시나리오 S:
# 학생이 연속으로 5회 공부하면 아이큐가 1 올라간다.
class Student:
def __init__(self, name):
self.name=name
self.iq=100
self.__scnt=0 #연속으로 공부한 횟수
def study(self):
self.__scnt+=1
if self.__scnt==5: #정보 은닉한 멤버에는 접근할 수 없다. -> 객체 외부에서 수정불가
self.iq+=1 #iq에만 직접적으로 접근 가능하다.
self.__scnt=0
def introduce(self):
print(f"이름은 {self.name} 이고 아이큐는 {self.iq} 입니다. SCNT 는 : {self.__scnt}")
s1 = Student("남궁길동")
s1.introduce()
s1.study()
s1.study()
s1.study()
s1.study()
print(s1.iq)
s1.iq=10293
s1.scnt=45 #정보은닉되어서 먹히지 않음
s1.introduce()
"""
이름은 남궁길동 이고 아이큐는 100 입니다. SCNT 는 : 0
100
이름은 남궁길동 이고 아이큐는 10293 입니다. SCNT 는 : 4
"""
#생성자, 소멸자
개체를 생성할 때 생성자 (init)을 호출한다.
해당 개체를 소멸하는 것은 garbage 수집기가 알아서 수행한다.
#시나리오 S:
# 학생이 연속으로 5회 공부하면 아이큐가 1 올라간다.
class Student:
def __init__(self):
print("__init__")
def __del__(self):
print("__del__")
print("===1===")
s1 = Student()
print("===2===")
s2 = Student()
print("===3===")
s3 = Student()
print("========")
exit(0)
"""
===1===
__init__
===2===
__init__
===3===
__init__
========
"""
#데이터 신뢰성을 높이는 멤버 - 설정자, 접근자
멤버 필드의 가시성을 차단하고 필요하면 설정자와 접근자를 제공하자.
설정자 - 멤버 필드에 값을 설정하는 메소드,
set_멤버필드명 접근자 - 멤버 필드에 값을 확인하는 메소드, get_멤버필드명
class Student:
def __init__(self,name,num):
self.__name = name
self.__num = num
self.__korea = 0
self.__eng = 0
self.__math = 0
def get_name(self):
return self.__name
def get_num(self):
return self.__num
def set_korea(self, score):
self.__korea = score
def set_eng(self, score):
self.__eng = score
def set_math(self, score):
self.__math = score
def get_korea(self):
return self.__korea
def get_eng(self):
return self.__eng
def get_math(self):
return self.__math
def tostr(self):
return f"이름: {self.__name}, 번호: {self.__num}, 국어: {self.__korea}, 영어: {self.__eng}, 수학: {self.__math}"
s1 = Student("선우길동", 3)
print(s1.tostr())
s1.set_korea(90)
s1.set_eng(100)
s1.set_math(89)
print(s1.tostr())
"""
이름: 선우길동, 번호: 3, 국어: 0, 영어: 0, 수학: 0
이름: 선우길동, 번호: 3, 국어: 90, 영어: 100, 수학: 89
"""
'PYTHON > 문법' 카테고리의 다른 글
파이썬 - 반복문(리스트,튜플) (0) | 2023.09.15 |
---|