- 단일 상속
- 다형성을 구사 가능
- 메소드 오버라이딩을 통해 부모클래스 메소드의 은닉화 가능
- 자식클래스에 생성자가 있을 경우, 자식클래스 생성자만 호출된다.
- 부모클래스를 바로 접근하기 위해 super() 키워드 사용class Animal: # 상위클래스(부모클래스) def move(self): print('움직이는 생물') class Dog(Animal): # 클래스의 파라미터로 상위클래스(부모클래스)를 상속받는다. def move(self): print('움직이는 댕댕이') super().move() # 바로 부모클래스에 접근한다. dog1 = Dog(); dog1.move(); # 출력 : 움직이는 댕댕이 # 출력 : 움직이는 생물
- private 멤버
- private 변수 선언 : __변수이름class Person: say = 'person' age = '22' __kbs = '공영방송' # private
- method override
- 부모클래스의 메소드를 자식클래스에서 재정의하는 것
- 다형성 활성화class Parent: def printData(self): pass class Child1(Parent): def printData(self): print('Child1에서 재정의') # 메소드 오버라이딩 class Child2(Parent): def printData(self): print('Child2에서 override') print('오버라이드는 부모의 메소드를 자식이 재정의') c1 = Child1() c1.printData() # 출력 : Child1에서 재정의 print() c2 = Child2() c2.printData() # 출력 : Child2에서 override # 출력 : 오버라이드는 부모의 메소드를 자식이 재정의
- 다중 상속
- 상속받는 파라미터의 순서가 중요하다.
- 상속받는 순서가 앞에 있을수록 해당 클래스를 참조하는 우선순위가 높아진다.class Tiger: data = '호랑이 세상' def cry(self): print('호랑이는 어흥') def eat(self): print('맹수는 고기를 좋아한다.') class Lion: def cry(self): print('사자는 으르렁') def hobby(self): print('백수의 왕은 낮잡을 즐김') class Liger1(Tiger, Lion): # 같은 메소드나 필드가 있으면 Tiger 객체에 먼저 접근함 pass class Liger2(Lion, Tiger): # 같은 메소드나 필드가 있으면 Lion 객체에 먼저 접근함 pass l1 = Liger1() l2 = Liger2() l1.cry() l2.cry()
- 추상 클래스
- 다형성을 위해 자식클래스에서 부모클래스의 메소드 오버라이딩을 강제하는 클래스이다.
- 자식클래스에서 추상메소드를 구현하지 않으면 인스턴스 자체에 에러가 발생한다.
- 부모클래스의 일반메소드는 자식클래스에서의 구현이 선택적이다.
- 선언 방법
1. abc 모듈의 전체 기능을 import한다.
2. 클래스에 파라미터로 metaclass = ABCMeta를 받는다.
3. 오버라이딩을 강제할 메소드에 @abstarctmethod 장식자를 붙인다.# 1. abc 모듈 import from abc import * # 2. ABC 모듈에서 ABCMeta를 상속받는다. class AbstractClass(metaclass = ABCMeta): # 3. @abstractmethod 라는 장식자를 통해 추상 메소드로 선언 @abstractmethod def myMethod(self): pass class ImplClass(AbstractClass): def aa(self): print('aa') # 추상 메소드 구현 def myMethod(self): print('추상 메소드 구현함') impl = ImplClass() impl.aa()
- try except 문
- 작업 도중 발생하는 에러에 대처하기
- 문법 : try ~ except ~ finally ~def divide(a, b): return a/b try: c = divide(5, 1) print(c) a1 = [1, 2, 3] print(a1[2]) open('c:/a1.txt') except ZeroDivisionError: print('에러 : 0으로 나누면 안됩니다.') except IndexError: print('에러 : 가용된 인덱스를 초과하였습니다.') except Exception as e: print(f'에러 : {e}') finally: print('finally 실행')
- File I/O
- 파일 입출력
- os 모듈 : 파일 research를 도와주는 모듈 제공
- os.getcwd() : 현재 파일의 위치를 반환
- open(파일경로, 읽기쓰기모드, 인코딩) : 파일을 모드에 맞게 열어주는 내장 함수
- f1.read() : 파일의 전체 내용을 반환import os print(os.getcwd()) try: print('읽기') # f1 = open(r'C:\work\psou\pro1\pack5_fileIO\file_test.txt', mode='r', encoding='utf-8') f1 = open('./file_test.txt', 'r', encoding='utf-8') print(f1.read()) f1.close() print('저장') f2 = open('./file_test.txt', 'w', encoding='utf-8') f2.write('a1\n') f2.write('a2') f2.close() print('덮어쓰기') f3 = open('./file_test.txt', 'a', encoding='utf-8') f3.write('\na3') f3.write('\na4') f3.write('\na5') f3.close() print('읽기') f4 = open('./file_test.txt', 'r', encoding='utf-8') for li in f4: print(li) f4.close() except Exception as e: print(f'에러 : {e}')
- with + open()
- with 블록 안에서 파일 입출력 처리를 한번에 하는 작업try: # 저장 with open('./file_test3.txt', mode='w', encoding='utf-8') as f1: f1.write('파이썬 문서 저장\n') f1.write('with문을 쓰면\n') f1.write('명시적으로 close()를 하지 않는다.') with open('./file_test3.txt', 'r', encoding='utf-8') as f2: reader = f2.read() print(reader) except Exception as e: print(f'에러 : {e}')
- read 모드에서 여러 줄을 차례로 읽는 법
- for문 사용
for li in f1: print(li)
- while문 사용
line = f1.readline() while line: print(line) line = f1.readline()
try: addr = input('동 이름 입력 : ') with open('./zipcode.txt', 'r', encoding='euc-kr') as f1: line = f1.readline() while line: # line = line.split('\t') line = line.split(chr(9)) if line[3].startswith(addr): if line[1] == '경기': print(f'[{line[0]}] - {line[1]}도 {line[2]} {line[3]}') else: print(f'[{line[0]}] - {line[1]}시 {line[2]} {line[3]}') line = f1.readline() except Exception as e: print(f'에러 : {e}')
- Pickle 모듈
- 모듈이나 모델 등을 객체화시켜서 저장하거나 로드한다.
- 용량이 큰 BERT 모델같은 경우에 zip 형태의 pickle로 쉽게 저장할 수 있다.import pickle test = () test2 = [] test3 = [] try: dictData = {'a1':'111-1234', 'a2':'123-1234'} listData = ['곡물', '새우깡'] tupleData = (listData, dictData) # 객체로 저장할 때는 wb로 저장함 with open('./tupleObject.pickle', 'wb') as f1: pickle.dump(tupleData, f1) pickle.dump('aa', f1) # 객체를 읽을 때는 rb로 저장함 with open('./tupleObject.pickle', 'rb') as f2: test, test2 = pickle.load(f2) test3 = pickle.load(f2) except Exception as e: print(f'에러 : {e}') print(test) print(test2) print(test3)
- sqlite3
- 파이썬 기본 개인용(로컬용) 데이터베이스import sqlite3 conn = sqlite3.connect('exam.db') conn = sqlite3.connect(':memory:') # ram에 일시적으로 데이터가 저장된다. (휘발성) = 테스트용 try: cursor = conn.cursor() # cursor를 이용해서 SQL문 처리 # 테이블 생성 cursor.execute("CREATE TABLE if not exists fritab(name text, phone text)") # 자료 추가 cursor.execute("INSERT INTO fritab(name, phone) VALUES('한국인', '111-1234')") cursor.execute("INSERT INTO fritab(name, phone) VALUES('a1', '123-1234')") cursor.execute("INSERT INTO fritab(name, phone) VALUES('a2', '122-1234')") inputdata = ('a3', '133-1234') cursor.execute(f"INSERT INTO fritab(name, phone) VALUES{inputdata}") conn.commit() # SELECT cursor.execute("SELECT * FROM fritab") print(cursor.fetchone()) print() list = cursor.fetchall() for li in list: print(li) except Exception as e: print(f'에러 : {e}') finally: conn.close()
- MariaDB
- anaconda prompt에서 pip install mysqlclient 입력
1. MariaDB 설치 : Windows 64bits 설치1-1. root password, confirm 비밀번호 설정한다.
1-2. Enable access와 use UTF8를 체크하기
2. Command Prompt (MariaDB 10.9) 실행
2-1. mariadb -uroot -h127.0.0.1 -p 입력 후, 비밀번호 입력
2-2. DB 확인 : show databases;
2-3. DB 생성 : create database test;
2-4. DB 이동 : use test;
2-5. DB 삭제 : drop database test;
3. 테이블 관리
3-1. 전체 테이블 확인 : show tables;
3-2. 특정 테이블 구조 : desc 테이블명;
3-3. 테이블 생성 : create table 테이블명(칼럼명 데이터타입, ....);
4. 데이터 관리
4-1. 데이터 삽입 : insert into 테이블명(칼럼1, 칼럼2, ..) values(데이터1, 데이터2, ..);
4-2. 데이터 수정 : UPDATE 테이블명 SET 칼럼1=수정값, 칼럼2=수정값 WHERE 칼럼=값;
4-3. 데이터 삭제 : DELETE FROM 테이블명 WHERE 칼럼=값;