다중 상속 / 함수 / 예외처리 / 파일 읽고 쓰기

2022. 10. 9. 12:32Dev.Program/Python & R

728x90

< 다중 상속 >

# 다중상속
class Tiger:
   def jump(self):
       print("호랑이 점프!")

class Lion:
   def bite(self):
       print("사자 꿀꺽!")

class Liger(Tiger, Lion):
   def play(self):
       print("라이거 놀기!")
   def jump(self):
       print("라이거 점프!")

li = Liger()
li.play()
li.jump()
li.bite()

  • play() 와 jump() 는 재정의했기 때문에 재정의한 것이 나오고, bite는 재정의 안해서 부모의 bite() 그대로 나옴!
  • 이렇게 다중상속이 가능하다!

 

< 인스턴스 함수 >

# 인스턴스 self.변수   인스턴스 함수(self)
# 객체생성없이 사용할 수 있는 클래스 변수, 클래스 함수
class Car:
   count = 0 # 클래스 변수
   def __init__(self, color):
       self.color = color # 인스턴스 변수
       # 클래스 변수 : 객체 생성 없이 사용하는 변수, 클래스 정의 때 기억장소 할당
       Car.count = Car.count + 1
   # 인스턴스 함수
   def move(self):
       print(self.color, "차가 움직인다")

c1 = Car("노랑")
print(c1.color) # 인스턴스 변수 :객체 생성 시 기억장소 할당
print(c1.count) # 결과 1 , 클래스 변수 : 클래스 정의 때 기억장소 할당
print(Car.count)
c1.move()
# Car.move() 에러
c2 = Car("핑크")
print(c2.color)
print(c2.count) # 결과 2 (count 누적)
print(Car.count)
c2.move()
  • 인스턴스 생성될 때 count 값 누적!
  • (self) 붙은 게 인스턴스 함수!

 

< Static 함수 >

  • 이렇게만 하면 에러남!
  • 어노테이션 붙여줘야함!
# 스태틱 함수 호출class Car:
  count = 0 # 클래스 변수
  def __init__(self, color):
      self.color = color # 인스턴스 변수
      # 클래스 변수 : 객체 생성 없이 사용하는 변수, 클래스 정의 때 기억장소 할당
      Car.count = Car.count + 1
  # 인스턴스 함수
  def move(self):
      print(self.color, "차가 움직인다")
  # static 함수
  @staticmethod
  def check():
      print("static 함수!")
  # 클래스 함수
  @classmethod
  def check2(cls):
      print(Car.count, "클래스 메서드!")
 
  • 추가해주고 호출하면
  • 출력됨!

 

< 클래스 함수 >

  • 이렇게 하면 오류남!
  • 어노테이션과 cls 적어야 오류 사라짐!
  • self. 도 오류남!
class Car:
   count = 0 # 클래스 변수
   def __init__(self, color):
       self.color = color # 인스턴스 변수
       # 클래스 변수 : 객체 생성 없이 사용하는 변수, 클래스 정의 때 기억장소 할당
       Car.count = Car.count + 1
   # 인스턴스 함수
   def move(self):
       print(self.color, "차가 움직인다")
   # static 함수
   @staticmethod
   def check():
       print("static 함수!")
   # 클래스 함수
   @classmethod
   def check2(cls):
       print(Car.count, "클래스 메서드!")

# 클래스 함수 호출
Car.check2()
  • 추가!
  • 출력된다!



======== test6,py

< 예외 처리 >

> 수동으로 하는 방법

print("프로그램 시작")
a = 4
b = 0
if b!=0:
   print(a/b)
else:
   print("0으로 나눔!")
print("프로그램 끝!")
  • 이렇게 예외 부분을 따로 설정해줌

 

> 파이썬의 예외처리 사용

  • Error 구문들이 싹 나온다
  • try~catch 가 아니라 try~except
print("프로그램 시작1")
try:
   #예외 발생구문
   print(a/b)
except ZeroDivisionError as e:
   print(e)
finally:
   print("예외발생 상관없이 마무리 작업")
print("프로그램 끝2")
  •  
  • 예외 발생 한 이유 나온다!

 

a = [1, 2, 3]
try:
   print(a[3])
except IndexError as e:
   print(e)
finally:
   print("생략가능")

 

< 오류 회피 >

# 오류발생 -> 회피(오류메세지 없이 그냥 지나침) pass
try:
   f = open("없는 파일", 'r')
except FileNotFoundError as e:
   # print(e)
   # 예외 회피
   pass
finally:
   print("생략 가능")
  • pass 가 없을 때(print(e)
  • pass 로 오류회피 했을 때

 

< 오류 일부러 발생 시키기 >

# 오류 일부러 발생
class Bird:
   def fly(self):
       raise NotImplementedError

# Bird 클래스 객체 생성
b = Bird()
b.fly()
  • 에러메세지 나옴!

> 메서드 재정의 하면 오류 사라짐!

class Eagle(Bird):
   def fly(self):
       print("Bird 클래스의 fly() 메서드 오버라이딩!")

e = Eagle()
e.fly()
  • 출력창



======== test7.py

< 파일 읽고 쓰기 >

for i in range(1, 11, 1):
   data = "%d 번째\n" %i
   print(data)
# p171
# 파일 읽고 쓰기
# 파일 사용하기 위한 객체 생성
# 변수 = open("파일이름", "모드")
# 모드 w 파일 내용쓸 때 r 파일 읽을 때 a 새로운 내용 추가
# f = open("파일.txt", "w")
# f.write() 함수호출 f.read()  f.readline()  f.readlines()
# f.close()
f = open("filetest.txt", 'w')
for i in range(1, 11, 1):
   data = "%d 번째\n" %i
   print(data) # 화면에 출력
   f.write(data) # 파일에 쓰기
f.close()
  • 같은 경로에 파일 생성됨
  • D:\workspace_py\py1 경로 찾아가면
  • 이렇게 만들어져있다!

 

> 경로 설정 후 파일 만들기

# D:\workspace_py\py1/filetest2.txt
f2 = open("D:\workspace_py\py1/filetest2.txt", 'w')
for i in range(11, 21, 1):
   data = "%d 번째\n" % i
   print(data)  # 화면에 출력
   f2.write(data)  # 파일에 쓰기
f2.close()
  • 설정한 경로에 파일 만들어짐

 

> ‘w’ write 는 계속 덮어쓰기

> ‘a’ append 는 내용 추가

f = open("filetest.txt", 'a')
for i in range(11, 21, 1):
   data = "%d 번째\n" %i
   print(data) # 화면에 출력
   f.write(data) # 파일에 쓰기
f.close()
  • ‘a’ 로만 바꿔줌
  • 추가된다!

 

> ‘r’ 읽어오기

> readline() 한 줄 읽어오기

# filetest.txt 내용 읽어오기
f4 = open("filetest.txt", "r")
line = f4.readline()
print(line)
  • 한 줄만 읽어옴!
# filetest.txt 내용 읽어오기
f4 = open("filetest.txt", "r")
# line = f4.readline() # 한 줄 읽어오기
# print(line)
while True:
   line = f4.readline()
   if not line:
       break
   print(line)
f4.close()
  • 라인이 없으면 break 로 빠져나오고, 있으면 반복문을 통해 계속 print() 해줌
  • 출력됨

> readlines() 한 줄 씩 전체 출력하기

f5 = open("filetest2.txt", "r")
lines = f5.readlines()
print(lines)
  • 리스트 형태로 받아와짐
f5 = open("filetest2.txt", "r")
lines = f5.readlines()
# print(lines)
for l in lines:
   print(l)
  • for 문을 통해 리스트 뽑아옴

> read() 왕창 가져와서 전체 출력하기

f6 = open("filetest.txt", "r")
data = f6.read()
print(data)
f6.close()
  • 띄어쓰기가 없음! 왕창가져와서 한 번에 출력하기 때문!



728x90