✅ 클래스 상속
✅다이아몬드 상속
✅ try ~ except ~ fianlly 예외처리
✅ 표준라이브러리
class Base: #부모 클래스
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
print("Base 생성자")
def display(self):
print(f"x = {self.x}, y = {self.y}")
def add(self):
return self.x + self.y
def doubleX(self):
return self.x * 2
def doubleY(self):
return self.y * 2
#다형성 :overloading : 동일 클래스내에서 함수의 이름이 같지만 형태가 다른 함수를 만들 수 있는 성격
# def myadd(x,y) def(myadd(x,y,z)
# 파이썬은 오버로딩을 허용하지 않는다.
# 대신에 매개변수 기본값이라는 것을 통해서 유사한 결과를 가져온다.
# def myadd(x = 1, y = 2, z = 3) myadd(), myadd(10), myadd(10,20)
# overriding : 부모클래스와 자식클래스간에 벌어진다.
# 부모클래스에 있는 메서드가 마음에 안들어서 고쳐쓰기를 원할 때,
# 부모클래스의 함수 이름과 자식 클래스 함수 이름이 같으면 부모의 함수를 가려버린다.
# doubleX 특정 변수에 종속되기 때문에 따로 오버라이딩을 하지 않는다.
class Child(Base) : #Base 클래스를 상속 받음.
def __init__(self, x = 0, y = 0, z = 0):
#self.x = x
#self.y = y
#super() - 부모객체를 가져옴.
super().__init__(x,y) #부모생성자 호출
self.z = z
print("Child1 생성자")
#다른 언어의 경우에는 부모생성자 먼저 호출하고 자식생성자를 호출함.
#그런데 파이썬은 아님.
#부모생성자를 호출하는 방식으로 설계하는것이 바람직하다.
def display(self):
#super() 부모클래스의 함수를 먼저 호출하고 내가 만든 코드를 붙이고자 할 때
#==> super().함수명
print(f"x = {self.x}, y = {self.y}, z = {self.z}")
return
p = Base()
p.display()
p = Base(4,5)
p.display()
c1 = Child(1,2,3)
c1.display()
print(c1.doubleX())
print(c1.doubleY())
#파이썬은 다중상속을 허용한다. 클래스를 동시에 여러개 상속받는 경우
# A -> B -> C 중첩상속 : 모든언어가 이 구조는 허용한다.
"""
A B
C -- 부모클래스가 A,B인경우 두개 이상의 클래스를 상속받는경우를 다중상속이라고 한다. 자바는 단일상속만 가능,
다이아몬드 상속
A -> B --> D
A -> C --> D
"""
class Flyalbe:
def fly(self):
print("날 수 있다.")
def walk(self):
print("두 다리로 걷는다")
class Swimable:
def swim(self):
print("수영할 수 있다.")
def walk(self):
print("***두 다리로 걷는다***")
class Duck(Flyalbe, Swimable):
def quack(self):
print("꽥꽥")
# class Duck(Swimable, Flyalbe):
# def quack(self):
# print("꽥꽥")
d1 = Duck()
d1.fly()
d1.swim()
d1.quack()
d1.walk() #메서드명이 동일한 경우에는 앞에거를 호출한다.
#시스템이 제공하는 내장변수중에 __mro__가 상속받은 관계정보가 있어서
#이걸 따라 적용한다
#(<class '__main__.Duck'>, <class '__main__.Flyalbe'>, <class '__main__.Swimable'>, <class 'object'>)
print(Duck.__mro__) #클래스 멤버변수로 제공한다.
class A:
def __init__(self):
print("A 생성자 호출")
class B(A): #A를 상속받음
def __init__(self):
print(("B 생성자 호출"))
super().__init__() #부모생성자 호출하기
#A.__init__(self) - 파이썬 이전버전에서 문제 발생가능성 있음.
class C(A): #A를 상속받음
def __init__(self):
print(("C 생성자 호출"))
super().__init__() #부모생성자 호출하기
class D(B,C): #B,C를 둘다 받으면서 결과적으로 A가 두번 상속된다.
def __init__(self):
print(("D 생성자 호출"))
super().__init__() #부모생성자 호출하기
d = D() #객체생성 - mro 규칙을 따라간다.
#isinstance(객체, 클래스) 이 객체가 클래스의 인스턴스인지 확인해준다.
print(isinstance(d, A)) #True
print(isinstance(d, B)) #True
print(isinstance(d, C)) #True
print(isinstance(d, object)) #True
print(isinstance(d, str)) #False
#object - 모든 클래스의 Base 클래스이다. 무조건 상속을 받는다.
a = object()
print(a.__class__)
try:
x = 10
y = 0
z = x/y
print(f"x = {x}, y = {y}, z = {z}")
except ZeroDivisionError as e:
print(e) # 결과 division by zero
try:
x = int(input("정수 : "))
y = int(input("정수 : "))
z = x/y
print(f"x = {x}, y = {y}, z = {z}")
except ZeroDivisionError as e:
# print(e)
print("0으로 나눌 수 없습니다.")
try:
x = int(input("정수 : "))
y = int(input("정수 : "))
z = x/y
print(f"x = {x}, y = {y}, z = {z}")
except ZeroDivisionError as e:
# print(e) # 결과 division by zero
print("0으로 나눌 수 없습니다.")
#finally는 주로 파일, 데이터베이스, 네트워크 처리등에 많이 사용한다.
#파일, 데이터베이스, 네트워크 연결 ...등등 오류발생 close
finally:
print("이 부분은 반드시 실행된다.")
try:
a = [1,2,3,4,5]
b = a[5] #IndexError가 나는 상황을 만들어봄.
except ZeroDivisionError as e:
print(e)
except IndexError as e:
print(e)
except Exception as e: #폭포수(casecading)
print(e)
#raise "예외문구" - 강제예외발생
#원래 함수 종료 구문은 return 하는일이 많다.
#return 값도 전송, 함수가 끝날 때 마무리작업을 하고 나온다.
#return은 객체지향 이전부터 존재함
#생성자에 오류가 발생했을 때 어떻게 할것이냐? return 사용불가,
#그래서 만든게 raise -> 정리작업도 하고 온다.
class Test:
def __init__(self):
# return True
raise Exception("객체 생성오류")
try:
t1 = Test()
except Exception as e:
print(e)
#내장함수 : 시스템에서 만들어준 함수.
print(abs(-4)) #abs : 절대값을 구함.
print(abs(4))
print(all([1,2,3])) #all : 지금 전달받은 요소중에 0이 하나라도 존재하면 False.
print(all([1,2,3,0])) #요소전체가 True이면 True
print(any([1,2,3])) #any : 지금 전달받은 요소중에 0이 아닌것이 하나라도 존재하면 True.
print(any([1,2,3,0])) #하나라도 True이면 True
#0 - False, "" - False
print(any(["a","b","c"])) #True
print(any(["a","b",""])) #True
#######################################
print(dir([1,2,3])) #dir : 객체가 지닌 변수나 함수를 보여줌.
print(dir(dict()))
mok, nmg = divmod(5,3) # divmod는 두개의 숫자를 입력받아 몫과 나머지를 튜플로 리턴
print(mok)
print(nmg)
for i, c in enumerate("Life is egg"): #enumerate 순서가 있는 데이터를 입력받아 인덱스값과 같이 리턴한다.
print(i,c)
result = eval("1+10+3") #문자열로 구성된 표현식을 입력으로 받아 해당 문자열을 실행한 결과값을 리턴
print(result)
a = [3,4,-1,2,9,8,7,12,15,21]
#음수만 filter의 첫번째 매개변수는 함수여야 한다.
#두번째 매개변수로 전달된 요소 하나를 매개변수로 하고 반환은 True or False
def isPositive(x):
if x > 0:
return True
return False
poList = list(filter(isPositive, a)) # filter : 리턴값이 참인 것만 걸러내서 리턴한다.
print(poList)
#한번 만들어서 쓰고 벌는 함수인 람다를 사용하자.
poList = list(filter(lambda x: x>0, a))
print(poList)
print(f"최대값 : {max(a)}, 최소값 : {min(a)}") #max()는 최대값, min() 최소값
print(pow(2,4))
#컴퓨터는 시간을 1970년 1월 1일을 기산점을 초당 1씩 카운드
import datetime
day1 = datetime.date(2021, 12, 14)
day2 = datetime.date(2023, 4, 5)
print(day1)
print(day2)
day3 = day2 - day1 #timedelta 객체로 바뀌고 날짜를 갖고 있다.
print(day3.days)
#말일까지 얼마나 남았는가?
day1 = datetime.date(2025, 5, 13)
day2 = datetime.date(2025, 5, 31)
print((day2-day1).days)
import calendar
from datetime import date
#오늘 날짜를 구한다.
today = date.today()
year = today.year
month = today.month
#tuple #해당월의 첫째날과 마지막날
last_day = calendar.monthrange(year,month)[1]
print(last_day)
day1 = datetime.date(year, month, last_day)
print((day1 - today).days)
#오늘은 무슨 요일인지
print(today.weekday()) #0이 월요일, 1이 화요일 ... 등
#문제 : 날짜를 입력받아서 그날이 무슨 요일인지를 반환
#김성재풀이
day = datetime.date(2025, 5, 11) #입력 : 날짜 : "2025-05-11"
day_yoil = day.weekday()
if day_yoil == 0: #계산 : 요일(숫자) -> 요일(문자)로 변환
print("월")
elif day_yoil == 1:
print("화")
elif day_yoil == 2:
print("수")
elif day_yoil == 3:
print("목")
elif day_yoil == 4:
print("금")
elif day_yoil == 5:
print("토")
elif day_yoil == 6:
print("일")
else:
print("뭘까?")
#백현숙강사님 풀이 / 배열을 활용해서 풀어야하는데 나는 if문만 주구장창 돌렸다.
day1 = datetime.datetime.strptime("2025-05-11", "%Y-%m-%d")
print(day1.weekday())
def getWeekday(s):
day1 = datetime.datetime.strptime(s, "%Y-%m-%d")
weekday = day1.weekday()
titles = ["월요일","화요일","수요일","목요일","금요일","토요일","일요일"]
return titles[weekday]
print(getWeekday("2025-04-11"))
# #딥러닝때 shutil 사용함.
# shutil_copy.py
import shutil
shutil.copy("c:/doit/a.txt", "c:/temp/a.txt.bak")
#glob 모듈은 디렉터리 안의 파일들을 읽어서 리턴한다.
import glob
glob.glob("c:/doit/mark*") #?는 1자리 문자열, *은 임의의 길이의 문자열을 의미한다.
['c:/doit\\marks1.py', 'c:/doit\\marks2.py', 'c:/doit\\marks3.py']
import os
print(os.environ) #os.environ은 현재 시스템의 환경 변숫값을 리턴.
print(os.environ["PATH"]) #PATH만 따로 부르는 법
print(os.getcwd()) #현재 자신의 디렉터리 위치를 리턴
#파이썬에서 os명령어를 쓰고 싶을 때는 아래와 같이 작성한다.
os.system("dir/w")
